试图更好地掌握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更改为未被选中。这是正确的方法吗?正在阅读细胞出列问题,这是我自己提出的最佳解决方案
答案 0 :(得分:0)
1)这是正确的,但是如果您使用带有原型单元格的故事板或者CellIdentifier
手动register自定义单元格类,那么您可以调用
[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
它将始终返回正确的单元格(请参阅documentation)
2)你可以这样做,但为了简单起见,你甚至可以使用-1(或UISegmentedControlNoSegment
)代替2作为新单元格的selectedIndex。这样你可以避免使用if (selectedIndex == 2)
,如果有一天你想在分段控件中添加第三个段,那么它就不会在那里中断。
如果在重用单元格之前要重置更多属性,那么我建议您继承UITableViewCell
并使用prepareForReuse方法重置工作。