为了解决那些说“这是个坏主意”的人,就我而言,我对此的需要是我的按钮上有一个按钮UITableViewCell
,当按下它时,它会转到另一个视图。由于这不是单元格本身的选择,[self.tableView indexPathForSelectedRow]
因此不起作用。
这给我留下了两个选择:
- 将需要传递到视图中的对象存储在表格单元格本身中。虽然这可行,但它会破坏我的观点,
NSFetchedResultsController
因为我不想将所有对象都存储在内存中,特别是如果表很长。
- 使用索引路径从 fetch 控制器中检索项目。是的,我必须通过黑客来弄清楚这似乎很难看
NSIndexPath
,但它最终比将对象存储在内存中更便宜。
indexPathForCell:
是正确的使用方法,但我会这样做(假设此代码在以下子类中实现UITableViewCell
:
// uses the indexPathForCell to return the indexPath for itself
- (NSIndexPath *)getIndexPath {
return [[self getTableView] indexPathForCell:self];
}
// retrieve the table view from self
- (UITableView *)getTableView {
// get the superview of this class, note the camel-case V to differentiate
// from the class' superview property.
UIView *superView = self.superview;
/*
check to see that *superView != nil* (if it is then we've walked up the
entire chain of views without finding a UITableView object) and whether
the superView is a UITableView.
*/
while (superView && ![superView isKindOfClass:[UITableView class]]) {
superView = superView.superview;
}
// if superView != nil, then it means we found the UITableView that contains
// the cell.
if (superView) {
// cast the object and return
return (UITableView *)superView;
}
// we did not find any UITableView
return nil;
}
PS我的真实代码确实从表格视图中访问了所有这些,但我给出了一个示例,说明为什么有人可能想直接在表格单元格中执行类似的操作。