segue 不适用于 UITableViewCell alloc,但 dequeueReusableCellWithIdentifier
Posted
技术标签:
【中文标题】segue 不适用于 UITableViewCell alloc,但 dequeueReusableCellWithIdentifier【英文标题】:segue not working with UITableViewCell alloc, but dequeueReusableCellWithIdentifier 【发布时间】:2013-02-22 01:50:22 【问题描述】:我在 UINavigationController 中使用带有 UITableView 的情节提要。 在这个 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 与 deque.. 方法的区别。我错过了什么?
edit) 我知道不使用 dequeReusableCell 方法对性能不利。但是,细胞的数量不会很多。这就是我不需要 deque 方法的原因。
“不工作”的意思是“不执行push segue”,不崩溃。
它显示的单元格与使用 dequeReusable 方法时相同,除了单元格右侧的公开指示图标。指示器图标来自故事板设置。
当我触摸单元格时,单元格以蓝色突出显示,但没有执行推送。
CustomTableViewCell 有 4 个属性。这与 UITableViewCell 完全不同。用户在 DetailViewController 设置属性(将 segue 推到此)。该单元格没有 IBOutlet 参考。在MasterViewController(有tableView)中,cellForRowAtIndexPath方法返回CustomTableViewCell上面的代码。
cellForRowAtIndexPath 方法在 CustomTableViewCell 上的指示器左侧添加一个开/关按钮 并为单元格设置一个标签号。
【问题讨论】:
请注意,在使用 Storyboards 时,dequeueReusableCellWithIdentifier
将始终为您提供一个单元格。
【参考方案1】:
dequeueReusableCellWithIdentifier
的使用使您能够使用原型单元。如果您使用initWithStyle
而不是dequeueReusableCellWithIdentifier
,那么您不会,因此您也会丢失您为这些单元原型定义的任何segue、披露指示符和其他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
的决定。
【讨论】:
谢谢。清晰而干净的答案。并感谢您的建议。以上是关于segue 不适用于 UITableViewCell alloc,但 dequeueReusableCellWithIdentifier的主要内容,如果未能解决你的问题,请参考以下文章
PFFacebookUtils.logInInBackground 不执行 segue