Here is an example of UITableView
making use of UIPickerView
embedded in the cells.
I am not changing the color of the picker view, cells, height of cells - I will leave that up to you to do something that suits your needs.
But the main idea here is to show you how you could have picker view in cells and be able to get value accordingly.
@interface YourController ()
@property (strong, nonatomic) NSMutableArray *pickerViewsArray;
@end
@implementation YourController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self)
{
// Custom initialization
}
return self;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.pickerViewsArray = [[NSMutableArray alloc] init];
[self createYourPickerViews];
}
- (void)createYourPickerViews
{
for(int x = 0; x < 10; x++) //number of picker views
{
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:(CGRect){{0, 0}, 150, 10}];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.tag = x;
[self.pickerViewsArray addObject:pickerView];
}
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [self.pickerViewsArray count]; //As mentioned before, this is important.
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
// Configure the cell...
cell.textLabel.text = [NSString stringWithFormat:@"%i", indexPath.row];
[cell.contentView addSubview:(UIPickerView*)[self.pickerViewsArray objectAtIndex:indexPath.row]];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 150.0f; //just some arbitrary value, change it to suit your needs.
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//tag corresponds to row on tables view.
NSLog(@"view tag:%ld", (long)pickerView.tag);
//row here corresponds to the value selected from picker view.
NSLog(@"view value:%ld", (long)row);
}
- (NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [NSString stringWithFormat:@"%d", row+1];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
//change this value to suit your needs.
return 10;
}
@end
Finally make sure to do this in your .h:
@interface YourController : UITableViewController <UITableViewDataSource, UITableViewDelegate, UIPickerViewDelegate, UIPickerViewDataSource>
With this you could be able to retrieve the value from picker view from each different cell accordingly.
For UI I leave that to you. Code is tested. Hope this helps.
Post-Comment (Update 2):
I ran it again and I see what you meant, although it didn't happen to me yesterday. I made changes to the following and ran another test, this will fix it:
In cellForRowAtIndexPath
:
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [NSString stringWithFormat:@"%i", indexPath.row];
[cell.contentView addSubview:[self.pickerViewsArray objectAtIndex:indexPath.row]];
}
Another Update (concerning UI: how to hide and un-hide picker when tapped on cells):
Modify this to:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIPickerView *temp;
temp = [self.pickerViewsArray objectAtIndex:indexPath.row];
if(!temp.isUserInteractionEnabled)
{
[UIView animateWithDuration:1.0f animations:^
{
temp.userInteractionEnabled = YES;
temp.layer.opacity = 1.0f;
}
completion:^(BOOL finished)
{
}];
}
else
{
[UIView animateWithDuration:1.0f animations:^
{
temp.userInteractionEnabled = NO;
temp.layer.opacity = 0.0f;
}
completion:^(BOOL finished)
{
}];
}
}
And in:
- (void)createYourPickerViews
{
for(int x = 0; x < 10; x++)
{
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:(CGRect){{0, 0}, 150, 10}];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.layer.opacity = 0.0f; ======>>> //Add this
pickerView.userInteractionEnabled = NO; =======>>> //And this
pickerView.tag = x;
[self.pickerViewsArray addObject:pickerView];
}
}
Again, code is tested. Hope this (finally) helps.