Przed iOS7, nadzór komórki był tym, UITableViewktóry ją zawierał. Począwszy od iOS7 GM (a więc prawdopodobnie będzie również w publicznym wydaniu), nadzór komórki to, a UITableViewWrapperViewjej superview jest UITableView. Istnieją dwa rozwiązania tego problemu.
Rozwiązanie nr 1: Utwórz UITableViewCellkategorię
@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
Jest to dobry zamiennik do używania cell.superview, ułatwia refaktoryzację istniejącego kodu - wystarczy wyszukać i zamienić go [cell relatedTable], a następnie wrzucić potwierdzenie, aby upewnić się, że jeśli hierarchia widoku zmieni się lub powróci w przyszłości, pojawi się natychmiast w twoich testach.
Rozwiązanie nr 2: Dodaj słabe UITableViewodniesienie doUITableViewCell
@interface SOUITableViewCell
@property (weak, nonatomic) UITableView *tableView;
@end
Jest to znacznie lepszy projekt, chociaż będzie wymagał nieco więcej refaktoryzacji kodu w istniejących projektach. W swojej tableView:cellForRowAtIndexPathużytku SOUITableViewCell jako klasy komórek lub upewnij się, że zwyczaj klasa komórek z podklasy SOUITableViewCelli przypisać tableView do komórki mienia Tableview. Wewnątrz komórki możesz odwołać się do zawierającego ją widoku tabeli, używając self.tableView.