ios objective-c uitableview uirefreshcontrol

ios - Encabezado desplazado en TableView con UIRefreshControl



pull to refresh swift 4 (4)

Mi UIRefreshController está haciendo algo extraño. Cuando se desactiva la actualización, los encabezados de tableView se desplazan.

Si lo despliego, se ve bien, pero si me desplazo hacia abajo en la tabla mientras el programa de actualización aún funciona, los encabezados se compensan con la altura del control de actualización mientras que las celdas UITable están bien y se desplazan detrás del encabezado.

Quiero evitar crear un tableViewController, por lo que estoy haciendo lo siguiente en viewDidLoad:

_refreshControl = [[UIRefreshControl alloc] init]; [_refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged]; [_tableView addSubview:_refreshControl];

Tengo muchas tablas en diferentes controladores de vista que requieren esta funcionalidad. ¿Hay alguna manera de evitar hacer un UITableViewController para cada uno?

¡Gracias una tonelada!


Esto podría ser un problema debido al hecho de que está agregando _refreshControl como una subvista que no debe realizarse. Sin embargo, puede crear un objeto UITableViewController agregarlo como el controlador de vista secundario de su clase de viewcontroller actual.

Por ejemplo:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; [self addChildViewController:tableViewController]; tableViewController.refreshControl = [[UIRefreshControl alloc] init]; [tableViewController.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; tableViewController.tableView.frame = CGRectMake(...);//set the frame here [self.view addSubview:tableViewController.tableView];


Intente de esta manera agregar controlador de vista push.

Cree un controlador de vista de tabla y agréguelo como la vista secundaria del controlador de vista existente. Luego, asigne su vista de tabla y actualice los controladores a las propiedades del controlador de vista de tabla.

UITableViewController *newTableViewController = [[UITableViewController alloc] init]; newTableViewControler.tableView = <yourTableView>; <yourRefreshController> = [[UIRefreshControl alloc] init]; [<yourRefreshController> addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; newTableViewController.refreshControl = _chatListRefreshControl; [self addChildViewController:newTableViewController];


Una solución rápida a esto es ir así

C objetivo

//header @property UITableViewController *tableController; //.m (right at the beginning of viewDidLoad for example) self.tableController = [[UITableViewController alloc] init]; [self addChildViewController:self.tableController]; self.tableController.tableView = self.tableView; ... //then create the refresh control and assign it to the UITableViewController self.tableController.refreshControl = refreshControl;

Swift 2.1

//Create an instance of a UITableViewController. This will host your UITableView. private let tableController = UITableViewController() //Add tableController as a childViewController and set its tableView property to your UITableView. self.addChildViewController(self.tableController) self.tableController.tableView = self.tableView self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged) self.tableController.refreshControl = self.refreshControl

esto ayuda si tiene su mesa conectada a un IBOutlet y tiene otras cosas vinculadas al guión gráfico con el que no tiene ganas de meterse.


UIRefreshControl no están destinados a ser subvistas, están destinados (literalmente) a ser el control de actualización de la tabla. UITableViewController tiene una salida específica para ellos (de nuevo, literalmente llamada refreshControl ) que debe usar. Como subvista de la tabla, es posible que la tabla suponga que es una celda, en lugar de solo una subvista, lo que obliga a un nuevo cálculo a su alrededor. Habrá casos en los que tenga suerte y el control se pueda ubicar en el lugar correcto, pero esto es, nuevamente, el resultado de un comportamiento indefinido.

UITableViewController no pretende ser una clase limitante, y ciertamente no debería impedirle implementar "vistas de múltiples tablas" (que son lo suficientemente específicas del contexto para que justifiquen un nuevo controlador de vista presentado de todos modos). Si le preocupa tener que escribir repetitivo para cada clase, escriba un controlador de superclase abstracto para cada vista de tabla que desee implementar y haga una subclase según sea necesario.