UITableView y UIRefreshControl se movieron por razones desconocidas

Tengo un UITableViewController en mi aplicación con un UIRefreshControl agregado. Sin embargo, a veces (no estoy seguro de cómo reproducir esto, sucede de vez en cuando), obtengo un poco de espacios en blanco adicionales en la parte superior de la vista de la tabla con el control de actualización siendo compensado incluso debajo de eso.

Esto es lo que parece (inactivo a la izquierda, tirado hacia abajo a la derecha):

captura de pantalla

No tengo ni idea de qué podría estar causando esto. En my viewdidload solo realizo la instancia del control de actualización y llamo a una function de actualización que establece el título atribuido. Me he movido agregando el control de actualización a la vista de la tabla en viewDidAppear como lo he leído en otra parte. Esto es como se ve ese código:

override func viewDidLoad() { super.viewDidLoad() self.refreshControl = UIRefreshControl() updateData() } override func viewDidAppear(animated: Bool) { refreshControl!.addTarget(self, action: "updateData", forControlEvents: UIControlEvents.ValueChanged) tableView.insertSubview(self.refreshControl!, atIndex: 0) } func updateData() { //... ServerController.sendParkinglotDataRequest() { (sections, plotList, updateError) in //... // Reload the tableView on the main thread, otherwise it will only update once the user interacts with it dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() // Update the displayed "Last update: " time in the UIRefreshControl let formatter = NSDateFormatter() formatter.dateFormat = "dd.MM. HH:mm" let updateString = NSLocalizedString("LAST_UPDATE", comment: "Last update:") let title = "\(updateString) \(formatter.stringFromDate(NSDate()))" let attributedTitle = NSAttributedString(string: title, attributes: nil) self.refreshControl!.attributedTitle = attributedTitle }) } } 

¿Necesita agregar el control de renovación como una subview de tableView? Creo que todo lo que necesitas hacer es asignar self.refreshControl. De acuerdo con la documentation:

El valor pnetworkingeterminado de esta propiedad es nil.

Asignar un control de renovación a esta propiedad agrega el control a la interfaz asociada del controller de vista. No es necesario configurar el marco del control de actualización antes de asociarlo con el controller de vista. El controller de vista actualiza la altura y el ancho del control y establece su position de manera apropiada.

Agregar una subvista en viewDidAppear podría ejecutarse más de una vez. Si presiona un controller desde una celda y lo devuelve, se volverá a llamar. Podría ser que insertSubview compruebe si la actualización ya tiene un elemento primario y lo elimina primero, por lo que podría no ser su problema. Solo debe hacer la inserción cuando el controller aparece por primera vez.

updateData también se puede agregar varias veces.

Entonces, creo que solo necesitas asignar self.refreshControl y luego agregar un controller para la acción de actualización como lo haces ahora con addTarget pero esta vez hacerlo en self.refreshControl.

También puedes hacer todo esto desde el guión gráfico. En storyboard, select UITableViewController y, en el inspector de attributes, simplemente establezca el atributo Refreshing en habilitado. Esto agrega un UIRefreshControl en la tabla y puede verlo en la jerarquía de la vista. A continuación, puede simplemente arrastrar CTRL de manera normal desde el control de actualización al file .h y agregar una acción para valueChange que se disparará cuando descienda el control de actualización en la tabla.

Bueno, creo que su comportamiento descrito no necesariamente debe ser causado por el control de actualización. De acuerdo con el hecho de que no tiene ninguna otra subvención debajo de la vista de la tabla, le recomiendo que intente colocar una vista "falsa" debajo de la vista de la tabla. Normalmente prefiero una label vacía con 0 longitud de lado.

introduzca la descripción de la imagen aquí

Tuve problemas similares como el tuyo donde mis inserciones de vista de tabla se rompieron en algunos casos. Y tan pronto como utilicé esta subvista "falsa", los problemas desaparecieron. También he leído sobre este problema en otros subprocesss. Y la solución fue esta. Parece ser un comportamiento / error extraño.

Darle una oportunidad 🙂