Oto inne rozwiązanie, które jest trochę inne.
Musiałem go użyć z powodu pewnych problemów z hierarchią widoków, które miałem: tworzyłem funkcjonalność, która wymagała przekazywania widoków do różnych miejsc w hierarchii widoków, które uległy uszkodzeniu podczas korzystania z widoku tabeli UITableViewController b / c tableView to widok główny UITableViewController ( self.view), a nie tylko zwykły widok, stworzył niespójne hierarchie kontrolera / widoku i spowodował awarię.
Zasadniczo utwórz własną podklasę UITableViewController i przesłonić loadView, aby przypisać self.view inny widok i przesłonić właściwość tableView, aby zwrócić osobny widok tabeli.
na przykład:
@interface MyTableVC : UITableViewController
@end
@interface MyTableVC ()
@property (nonatomic, strong) UITableView *separateTableView;
@end
@implementation MyTableVC
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:CGRectZero];
}
- (UITableView *)tableView {
return self.separateTableView;
}
- (void)setTableView:(UITableView *)tableView {
self.separateTableView = tableView;
}
@end
W połączeniu z rozwiązaniem Kellera będzie to bardziej niezawodne w tym sensie, że tableView jest teraz zwykłym widokiem, a nie widokiem głównym VC, i będzie bardziej odporny na zmianę hierarchii widoków. Przykład użycia w ten sposób:
MyTableVC *tableViewController = [[MyTableVC alloc] init];
tableViewController.tableView = self.myTableView;
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;
Istnieje inne możliwe zastosowanie:
Ponieważ podklasowanie w ten sposób oddziela self.view od self.tableView, możliwe jest teraz używanie tego UITableViewController jako bardziej zwykłego kontrolera i dodawanie innych widoków podrzędnych do self.view bez osobliwości dodawania widoków podrzędnych do UITableView, więc można rozważyć zrobienie ich przeglądaj kontrolery bezpośrednio podklasę UITableViewController zamiast mieć potomne UITableViewController.
Niektóre rzeczy, na które należy uważać:
Ponieważ zastępujemy właściwość tableView bez wywoływania super, mogą być pewne rzeczy, na które należy uważać i w razie potrzeby należy je obsłużyć. Na przykład ustawienie widoku tabeli w powyższym przykładzie nie doda widoku tabeli do self.view i nie ustawi ramki, którą możesz chcieć zrobić. Ponadto w tej implementacji nie ma domyślnego widoku tabeli podczas tworzenia instancji klasy, co można również rozważyć dodanie. Nie uwzględniam go tutaj, ponieważ tak jest w każdym przypadku, a to rozwiązanie faktycznie dobrze pasuje do rozwiązania Kellera.