Ios TableViewCell中的分段控件-重用单元格的正确方法

Ios TableViewCell中的分段控件-重用单元格的正确方法,ios,objective-c,uitableview,Ios,Objective C,Uitableview,为了更好地理解UITableViews是如何工作的,所以我提供了一个我不确定的背景问题,这引出了我下面的实际问题 1) 第一次创建单元时,包括 if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } 块初始化单元格。之后,如果您正在重用一个单元格,if语句将被跳过,并且您将只使用之前设置的单元格来创建

为了更好地理解UITableViews是如何工作的,所以我提供了一个我不确定的背景问题,这引出了我下面的实际问题

1) 第一次创建单元时,包括

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
块初始化单元格。之后,如果您正在重用一个单元格,if语句将被跳过,并且您将只使用之前设置的单元格来创建新的单元格(即deque方法)。对吗

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

让我们假设这样一个场景:我创建了我的第一个单元格,“参加”和“不参加”都没有按预期选择。假设现在我选择一个索引,现在向表中添加一个新行/单元格。我的问题是,当我设置断点时,我正在考虑创建一个新的单元格,即下面的这一步

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
我在调试器中查看我的selectedIndex,它存储的selectedIndex值与我刚刚修改的单元格相同(即“出席”或“不出席”,无论我之前选择的是0还是1)。我想这是有意义的,因为我正在对一个可重用的单元格进行出列,所以我想标记和类似的标记指向前一个单元格?通过执行以下操作,我能够解决重置新单元格以在创建时不选择索引的问题:

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

因此,现在当我创建一个新单元格时,即使SegmentedControl selectedIndex是0或1(在我已经在前一个单元格中选择之后),对象的初始selectedIndex是2。因此,我将强制SegmentedContorl的selectedIndex更改为nothing。这是正确的方法吗?这是我自己想出的最好的解决方案。这是正确的,但是如果你使用带有原型单元格的故事板,或者如果你手动为
CellIdentifier
创建一个自定义单元格类,那么你可以打电话

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
它将始终返回正确的单元格(请参阅)

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

如果在重用单元格之前需要重置更多属性,那么我建议您将
UITableViewCell
子类化,并在方法中执行重置工作

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];