Przed iOS7, nadzór komórki był tym, UITableView
któ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 UITableViewWrapperView
jej superview jest UITableView
. Istnieją dwa rozwiązania tego problemu.
Rozwiązanie nr 1: Utwórz UITableViewCell
kategorię
@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 UITableView
odniesienie 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:cellForRowAtIndexPath
użytku SOUITableViewCell jako klasy komórek lub upewnij się, że zwyczaj klasa komórek z podklasy SOUITableViewCell
i 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
.