我在UINavigationController中使用了带UITableView的storyboard。 在这个UITableView中,使用了具有内部属性的自定义tableViewCell。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomTableViewCell *cell = nil;
if (SYSTEM_VERSION_LESS_THAN(@"6.0") ) {
//iOS 6.0 below
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
}
else {
//iOS 6.0 above
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; //work segue
}
以上代码适用于push segue。但不是我用的时候
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; //not work segue
我使用这种alloc方法来保护单元格数据不会重复使用单元格。
这只是alloc vs deque ..方法的区别。我错过了什么?
编辑)我知道不使用dequeReusableCell方法对性能原因不利。但是,细胞数量不会很多。这就是我不需要deque方法的原因。
“不工作”意味着“不执行推送segue”,而不是崩溃。
除了单元格右侧的显示指示符图标外,它显示的单元格与使用dequeReusable方法时相同。指标图标来自故事板设置。
当我触摸单元格时,单元格突出显示为蓝色,但不执行推送segue。
CustomTableViewCell有4个属性。这与UITableViewCell完全不同。用户在DetailViewController上设置属性(推送segue导致这个)。该单元格没有IBOutlet参考。在MasterViewController(具有tableView)中,cellForRowAtIndexPath方法返回上面代码的CustomTableViewCell。
cellForRowAtIndexPath方法在CustomTableViewCell指示器的左侧添加一个开/关按钮 并为单元格设置标签号。
答案 0 :(得分:8)
dequeueReusableCellWithIdentifier
的使用使您可以使用原型单元格。如果您使用initWithStyle
代替dequeueReusableCellWithIdentifier
,那么您就不会,因此您也会丢失任何segues,披露指标,以及您为这些单元原型定义的其他UI外观。
如果你决定走这条路,你将不得不去“老学校”(即做我们以前在细胞原型之前做过的事情)并写下你自己的didSelectRowForIndexPath
。但是,如果您已经定义了segue,那么假设您将其称为“SelectRow”,那么您的didSelectRowForIndexPath
可以执行该操作:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"SelectRow" sender:cell];
}
如果您需要公开指标,那么您的自定义单元例程(或cellForRowAtIndexPath
)必须手动设置。如果你用
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
然后你需要手动处理它:
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"SelectAccessory" sender:cell];
}
最重要的是,你可以让它发挥作用,但你只是做了很多额外的工作,并且失去了出列单元格的性能和内存优势。我衷心鼓励您重新考虑不使用dequeueCellWithIdentifier
的决定。