Adding UIPickerView to a UITableViewCell

2019-08-02 09:20发布

I want to add a UIPickerView to a UITableViewCell. Right now I am just getting a black window. Can someone also explain me the concept of subclassing UI objects to a cell ie:when do we make our cell as the delegate and the datasource delegate? Thanks

EDIT: Here is the code of what i am doing right now

 case 1:  {
        cell = [tableView dequeueReusableCellWithIdentifier:@"groups"];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"groups"];
        }
            /*NSString *myGroupDetail = [_groupArray objectAtIndex:indexPath.row];
            NSLog(@"the group detail label is %@",myGroupDetail);
            cell.textLabel.text = myGroupDetail;
            */
        [cell addSubview:_groupPicker];

        break;

    }

The groups is the section in which I want the picker view, I am getting that data from an array. Here is what i want to implement

2条回答
聊天终结者
2楼-- · 2019-08-02 09:38

you would have to allocate and initialize a pickerview in your cellForRow method of the tableviewdelegate. ill sketch it for you =) how to initialize a cell itself should not be hard to find out if you google a bit ;-)

...(tableView *)... cellForRowAtIndexPath... {

if(indexPath.row == pickerRow){
    UIPickerView *pickerView = [[UIPickerView alloc]init];
    cell = ... // alloc and initialize a cell
    cell addSubview:pickerView];
    }
else{ // your other cells }   

return cell;
}

UPDATE: im currently having trouble with git, so i uploaded a sample project to my private server: UITablePicker example

github: https://github.com/sebamisc/UItableViewWithPicker

yu can modify and use the code however you want =)

sebastian

查看更多
可以哭但决不认输i
3楼-- · 2019-08-02 10:02

Well, I never did exactly that.

Does it have to be in a cell or could you use the table's header or footer view for that? (I would not suggest a section header/footer view.)

Assuming it is within a UITableViewCell. Yes, I personally would subclass UITableViewCell. Did that a lot. In that case you cell object could be the data source delegate of the picker. For doing so your subclass of UITableViewCell (let's assume you name it MyTableViewCell) needs to fulfil the related protocol. You add that UIPickerView programmatically within the init Method (initWithStyle) of MyTableViewCell. For the layout within the table cell, you should overwrite the method layoutSubviews. If your app can be rotated to landscape and portrait orientations and/or if your app is designed to run on iPad as well, then this method should dynamically consider the table's bounds. (Screen or windwo bounds are often used hiere but that is not save when the table is displayed within a split master view or a popup view on iPads.)

Strictly spoken your MyTableViewCell should not be the data source delegate, simply because it is a view element and view objects are not supposed to manage any business logic within an MVC design pattern. Smarter would be the implementation of some dedicated view controller for your table view cell hat fulfills the protocol and is assigned as the delegate. However, both would work. In the event that it is the only picker view within your sell, then you could easily use your UITableViewController subclass even without tagging the UIPickerView.

An alternative to subclassing a UITableViewCell is to create the UIPickerView within the cellForRowAtIndexPath method of your tableViewController. That is fine for singe-orientation apps. However, you may setup it in a way that it re-arranges its the UIPickerView automatically.

In any case you should overwrite the heightForRowAtIndexPath method of UITableViewController when your table views do not have the same hight any more. If all of them still have the same height, then you can simply set the rowHeight property of your UITableView.

查看更多
登录 后发表回答