「これは悪い考えだ」と言う人に対処するために、私の場合、これが必要なのは、押すUITableViewCell
と別のビューへのセグエになるボタンがあることです。これはセル自体の選択ではないため、[self.tableView indexPathForSelectedRow]
機能しません。
これにより、2つのオプションが残ります。
- ビューに渡す必要があるオブジェクトをテーブル セル自体に格納します。これは機能しますが、特にテーブルが長い場合は、すべてのオブジェクトをメモリに格納したくない
NSFetchedResultsController
ため、.
- インデックス パスを使用して、フェッチ コントローラーからアイテムを取得します。はい、ハックして調べなければならないのは醜いようですが
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私の実際のコードは、テーブルビューからこれらすべてにアクセスしますが、誰かがテーブルセルでこのようなことを直接したい理由の例を示しています。