自定义 UITableViewCell 中的 UIPickerView

Posted

技术标签:

【中文标题】自定义 UITableViewCell 中的 UIPickerView【英文标题】:UIPickerView inside a Custom UITableViewCell 【发布时间】:2014-03-30 14:38:12 【问题描述】:

我有一个自定义的 UITableViewCell,里面有一个 UIPickerView。为了管理它,我创建了一个子类,我在其中实现了 UIPickerView 委托和数据源方法。当我这样实现的 cellForRowAtIndexPath 时:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    if (indexPath.section==2) 

        PickerCellTableViewCell *cell2=[tableView dequeueReusableCellWithIdentifier:@"pickerCell" forIndexPath:indexPath];
        cell2.cellPickerInputArray=self.pickerArray;

        return cell2;

    else

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"normalCell" forIndexPath:indexPath];

        cell.textLabel.text=[[self.inputArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

        return cell;

    

在子类 .m 文件中,我有以下内容:

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 

        return [self.cellPickerInputArray count];


我有以下问题:如果我这样离开它,它会崩溃并且控制台会给我这个:

无效更新:第 0 节中的行数无效。 更新 (7) 后包含在现有节中的行必须是 等于该节之前包含的行数 update (0),加上或减去插入或删除的行数 该部分(0 插入,0 删除)和加或减的数量 移入或移出该部分的行(0 移入,0 移出)。'

但是,如果我更改 numberOfRowsInComponent: 以返回实际的行数(本例中为 7),一切正常。

我一直在尝试,但找不到问题/解决方案。任何帮助,将不胜感激。提前致谢!

编辑!正如@meda 所建议的,我 NSLoged NSLog(@"PickerInputArray count"%@",[self.cellPickerInputArray count]); pickerView numberOfRowsInComponent

方法内部

这里:

2014-03-30 21:04:54.756 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.757 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.758 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.758 TestPickerOnTable[3498:60b] PickerInputArray count0
2014-03-30 21:04:54.762 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.765 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.767 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.770 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.771 TestPickerOnTable[3498:60b] PickerInputArray count7
2014-03-30 21:04:54.771 TestPickerOnTable[3498:60b] PickerInputArray count7

【问题讨论】:

记录它NSLog(@"PickerInputArray count"%@",[self.cellPickerInputArray count]); 如果它不等于 7,你需要找出原因 是的,已经试过了。请参阅上面的编辑。 【参考方案1】:

从您的日志来看,您的UIPicker 数据源中的元素数量似乎发生了变化。

当您从 self.inputArray 添加或删除元素时,请务必重新加载组件,否则您将收到无效更新错误。

重新加载选择器:

[_yourPicker reloadAllComponents]

【讨论】:

self.inputArray 是一个静态数组,它不会改变。我也不明白为什么“numberOfRowsInComponent”被调用了10次...... 是的,我注意到了,您是不是要为第 2 节的每一行返回该单元格? 没有。另外当 inputArray 内容为 16 项时,这个选择器方法被调用的次数也是一样的:10 次。【参考方案2】:

你两年前问过这个问题,所以你可能已经解决了,但问题是在cellForRowAtIndexPath 中,你根据IndexPath.section 的值创建了两种不同类型的单元格。

if indexPath.section == 2,您的(自定义)单元格有一个cellPickerInputArray。否则,您的(正常)单元格没有那个,所以您的 numberOfRowsInComponent 失败,因为现在有数组可以获取计数。

要解决此问题,请将您的 numberOfRowsInComponent 更改为具有相同的 if..then..else 结构:

if (indexPath.section==2) 
  return [self.cellPickerInputArray count];
 else 
  return <some appropriate value>;

【讨论】:

以上是关于自定义 UITableViewCell 中的 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章

在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局