iOS7以前は、セルのスーパービューはそれUITableView
を含むものでした。iOS7 GMの時点では(おそらく一般リリースにも含まれると思われます)、セルのスーパービューはでUITableViewWrapperView
あり、スーパービューはUITableView
です。この問題には2つの解決策があります。
解決策1:UITableViewCell
カテゴリを作成する
@implementation UITableViewCell (RelatedTable)
- (UITableView *)relatedTable
{
if ([self.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview;
else if ([self.superview.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview.superview;
else
{
NSAssert(NO, @"UITableView shall always be found.");
return nil;
}
}
@end
これは、を使用cell.superview
する場合の優れた置き換えであり[cell relatedTable]
、既存のコードを簡単にリファクタリングできます。検索してで置き換え、アサートをスローするだけで、ビュー階層が変更された場合や将来復帰した場合にすぐに表示されます。あなたのテストで。
解決策#2:に弱UITableView
参照を追加するUITableViewCell
@interface SOUITableViewCell
@property (weak, nonatomic) UITableView *tableView;
@end
これははるかに優れた設計ですが、既存のプロジェクトで使用するにはもう少しコードのリファクタリングが必要になります。あなたにはtableView:cellForRowAtIndexPath
あなたのセルクラスとして使用SOUITableViewCellかを確認してくださいカスタムセルクラスからサブクラス化されSOUITableViewCell
、セルののtableViewプロパティにのtableViewを割り当てます。セル内では、を使用して、含まれているテーブルビューを参照できますself.tableView
。