这是另一个解决方案,有些不同。
由于存在一些视图层次结构问题,我不得不使用它:我正在创建一些功能,要求将视图传递到视图层次结构的不同位置,当使用UITableViewController的tableview b / c时,tableView是UITableViewController的根视图( self.view),而不仅仅是常规视图,它会创建不一致的控制器/视图层次结构,并导致崩溃。
基本上,创建您自己的UITableViewController的子类,并覆盖loadView以便为self.view分配一个不同的视图,并覆盖tableView属性以返回单独的tableview。
例如:
@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
当与Keller的解决方案结合使用时,从tableView现在是常规视图而不是VC的根视图的角度来看,这将更加健壮,并且在更改视图层次结构方面也更加健壮。以这种方式使用它的示例:
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;
有另一种可能的用法:
由于以这种方式进行子类化可将self.view与self.tableView分开,因此现在可以将此UITableViewController用作常规控制器,并向self.view添加其他子视图,而无需在UITableView中添加子视图,因此可以考虑使用视图控制器直接是UITableViewController的子类,而不是具有UITableViewController子级。
需要注意的一些事情:
由于我们在不调用super的情况下覆盖了tableView属性,因此可能需要注意一些事项,并应在必要时进行处理。例如,在我上面的示例中设置tableview不会将tableview添加到self.view,也不会设置您可能想要做的框架。另外,在此实现中,实例化类时没有提供默认的tableView,您也可以考虑添加它。我不会在此包括它,因为这是逐案的,并且此解决方案实际上与Keller的解决方案非常吻合。