UITableViewCell中的UISegmentedControl - 重用单元格的正确方法

时间:2014-02-16 00:08:35

标签: ios objective-c uitableview

试图更好地掌握UITableViews是如何工作的,所以我提供了一个我不确定的背景问题,这导致了我下面的实际问题

1)首次创建单元格时,请包含

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

阻止初始化单元格。之后,如果您正在重用单元格,将跳过if语句,您将只使用之前设置的前一个单元格来创建您正在创建的新单元格(作为deque方法)。这是对的吗?

2)使用Storyboard,我在原型单元格中创建了一个分段控件,用于两个索引:“Attending”和“Not Attending”,因此每个新单元格都会创建一个新的分段控件。在创建单元格时不应该选择索引,但是当我向表中添加新的行/单元格时,选择索引时遇到了问题。

让我们来看看这个场景:我创建了我的第一个单元格,“Attending”和“Not Attending”都未按预期选择。现在说我选择其中一个索引,现在在我的表中添加一个新的行/单元格。我的问题是当我设置断点并且我正在查看新单元的创建时,即下面的这一步

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

我在调试器中查看我的selectedIndex,它存储与刚刚修改过的单元格相同的selectedIndex值(即“出席”或“未出席”,无论我之前选择的是0还是1)。我想这是有道理的,因为我出了一个可重复使用的单元格,所以我猜这些标签等指向前一个单元格?通过执行以下操作,我能够解决重置新单元格以在创建时未选择索引的问题:

注意,新事件对象/单元格的默认selectedIndex(此处标记为“公告”)为2):

   //set correct index
    if ([[self.announcements objectAtIndex:indexPath.section] selectedIndex] == 2){
        [attendingSegmentedControl setSelectedSegmentIndex:UISegmentedControlNoSegment];
    }
    else {
        attendingSegmentedControl.selectedSegmentIndex = [[self.announcements objectAtIndex:indexPath.section] selectedIndex];
    }  

所以现在当我创建一个新单元格时,即使SegmentedControl selectedIndex为0或1(在我之前的单元格中已经选中)之后,对象的初始selectedIndex为2。我强迫SegmentedContorl的selectedIndex更改为未被选中。这是正确的方法吗?正在阅读细胞出列问题,这是我自己提出的最佳解决方案

1 个答案:

答案 0 :(得分:0)

1)这是正确的,但是如果您使用带有原型单元格的故事板或者CellIdentifier手动register自定义单元格类,那么您可以调用

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

它将始终返回正确的单元格(请参阅documentation

2)你可以这样做,但为了简单起见,你甚至可以使用-1(或UISegmentedControlNoSegment)代替2作为新单元格的selectedIndex。这样你可以避免使用if (selectedIndex == 2),如果有一天你想在分段控件中添加第三个段,那么它就不会在那里中断。

如果在重用单元格之前要重置更多属性,那么我建议您继承UITableViewCell并使用prepareForReuse方法重置工作。