Aquí hay otra solución que es un poco diferente.
Tuve que usarlo debido a algunos problemas de la jerarquía de vistas que tenía: estaba creando algunas funcionalidades que requerían pasar vistas a diferentes lugares en la jerarquía de vistas, que se rompieron al usar una vista de tabla de UITableViewController b / c, la vista de tabla es la vista raíz de UITableViewController ( self.view) y no solo una vista normal, creó jerarquías inconsistentes de controlador / vista y causó un bloqueo.
Básicamente, cree su propia subclase de UITableViewController y anule loadView para asignar self.view una vista diferente, y anule la propiedad tableView para devolver una vista de tabla separada.
por ejemplo:
@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
Cuando se combina con la solución de Keller, esto será más robusto en el sentido de que tableView ahora es una vista normal, no una vista raíz de VC, y será más robusto frente a cambios en las jerarquías de vista. Ejemplo de usarlo de esta manera:
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;
Hay otro uso posible para esto:
Dado que la subclasificación de esta manera separa self.view de self.tableView, ahora es posible usar este UITableViewController como un controlador más regular y agregar otras subvistas a self.view sin las rarezas de agregar subvistas a UITableView, por lo que uno puede considerar hacer su ver los controladores directamente una subclase de UITableViewController en lugar de tener hijos de UITableViewController.
Algunas cosas a tener en cuenta:
Dado que estamos anulando la propiedad tableView sin llamar a super, puede haber algunas cosas a tener en cuenta y que debemos manejar cuando sea necesario. Por ejemplo, establecer la vista de tabla en mi ejemplo anterior no agregará la vista de tabla a self.view y no establecerá el marco que es posible que desee hacer. Además, en esta implementación no se proporciona una vista de tabla predeterminada cuando se instancia la clase, que también es algo que puede considerar agregar. No lo incluyo aquí porque es caso por caso, y esta solución en realidad encaja bien con la solución de Keller.