ios - uitabbarcontroller uinavigationcontroller




Control UIRefresh atascado después de cambiar las pestañas en UITabBarController (10)

Acabo de ver lo mismo. Lo que terminé haciendo es endRefreshing on viewWillDisappear y eso al menos elimina este problema. Sin embargo, volviendo a la pestaña, espero que comience a girar nuevamente cuando reinicio el proceso de actualización y vuelvo a llamar a BeginRefreshing, pero no es así. Lo hace en el caso cuando profundizo la navegación y luego regreso.

Tengo un UITableViewController como controlador de vista raíz en un UINavigationController, que a su vez es uno de los controladores de vista en un UITabBarController. Todo conectado en Storyboard.

También configuré el UIRefreshControl para mi tabla en el Storyboard, y normalmente parece que debería hacerlo al tirar:

Sin embargo, si cambio entre mis otras pestañas una o dos veces, se verá así:

No está girando ni nada, solo se atasca "lleno", y permanece así hasta que lo jale por completo y active una actualización.

Cualquier idea o sugerencia apreciará.


Después de encontrarme con el mismo problema varias veces, decidí crear una biblioteca para ello SwiftPullToRefresh .

Como se dijo antes, refreshControl debe refreshControl en viewDidDisappear(_:) y comenzar en viewWillAppear(_:) .

Al iniciar la animación refreshControl programación, tableView.contentOffset debe configurarse en el valor apropiado.

tableView.setContentOffset(CGPoint(x: 0, y: -(refreshControl?.bounds.height ?? 60) - topOffset), animated: true)

var topOffset: CGFloat {
    if let navigationBar = navigationController?.navigationBar, navigationBar.isTranslucent == true {
        return navigationBar.bounds.height + UIApplication.shared.statusBarFrame.height
    } else {
        return 0
    }
}

La mejor solución en Swift:

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)

  //fixes bug with refreshControl freezing while switching tabs
  if tableView.contentOffset.y < 0 {
    tableView.contentOffset = .zero
  }
}

La siguiente solución puede ayudarte.

CGFloat yTableViewOffset;

- (void)viewDidLoad {

      yTableViewOffset = kNilOptions;
}
- (void)viewWillAppear:(BOOL)animated
{
   if(yTableViewOffset != kNilOptions) {

     CGPoint offset = CGPointMake(tableView.contentOffset.x, yTableViewOffset);
     [refreshControl beginRefreshing];
     tableView.contentOffset = offset;

  }
}
- (void)viewWillDisappear:(BOOL)animated
{
   if(refreshControl.isRefreshing) {
     yTableViewOffset = tableView.contentOffset.y;
     [refreshControl endRefreshing];
  }
}

Mientras el control de actualización está girando, si presenta algún otro controlador y vuelve antes de "finalizar la actualización"; la animación de actualización se atascará.

Ninguna de las respuestas anteriores funcionó para mí, y no quería configurar Bool y seguirlo durante todo el ciclo de vida de un controlador de vista.

Mi solución es agregar el siguiente código al final de viewWillAppear.

en Objc;

if (self.refreshControl.isRefreshing) {
    [self.refreshControl endRefreshing];
    [self.tableView setContentOffset:CGPointMake(0, self.tableView.contentOffset.y-self.refreshControl.frame.size.height) animated: true];
    [self.refreshControl beginRefreshing];
}

en Swift;

if self.refreshControl.isRefreshing {
     self.refreshControl.endRefreshing
     self.tableView.setContentOffset(CGPoint(x: 0, y: self.tableView.contentOffset.y-self.refreshControl.frame.size.height), animated: true)
     self.refreshControl.beginRefreshing;
}

La lógica es; siempre que atrape el control de actualización está en estado de animación, lo detendrá sin saber si está atascado o no y volverá a ejecutar la animación.

Espero eso ayude.


No pude hacer que la llamada a endRefreshing funcionara antes de que ocurriera la navegación, así que abordé el problema desde el otro extremo y en la vista. Apareceré. Verifico si el valor de TableView contentOffset es un número negativo devuelve el valor de tableView a 0.

 - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if (self.tableView.contentOffset.y < 0)
    {
        [self.tableView setContentOffset:CGPointZero animated:YES];
    }
}

Quiero algunos puntos y me gusta la solución de Albert pero no su estilo.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _table.contentOffset = CGPointMake(_table.contentOffset.x, _table.contentOffset.y + 1.0f);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    _table.contentOffset = CGPointMake(_table.contentOffset.x, _table.contentOffset.y - 1.0f);
}

Sé que esto es increíblemente tarde, pero me parece mejor tarde que nunca.

Desafortunadamente, ninguna de las respuestas dadas funcionó para mí. Lo único que funcionó fue este terrible código en viewWillAppear:

self.refreshControl = nil;
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refreshFunction) forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;

Básicamente, recreo el UIRefreshControl cada vez que aparece la vista. Funciona, aunque da la siguiente advertencia:

Intentar cambiar el control de actualización mientras no está inactivo no se recomienda y probablemente no funcione correctamente.

Sinceramente, me sorprende que esto siga siendo un problema (aún lo veo en iOS 9 ahora). Esperemos que esto pueda ser útil para otras personas.


Tengo un collectionView y configuré su contentInset.

Al presionar algunos ViewControllers, luego presione el botón de inicio, y retroceda y vuelva a aparecer, el control UIRefresh siempre está en la parte superior.

Finalmente utilizo este código temporalmente, evítalo. (Feo pero para siempre siempre se muestra arriba)

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self.refreshControl endRefreshing];

    CGPoint currentContentOffset = self.collectionView.contentOffset;

    [self.collectionView setContentOffset:CGPointMake(currentContentOffset.x,
                                                      currentContentOffset.y - 1.0f)
                                 animated:YES];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGPoint currentContentOffset = self.collectionView.contentOffset;

    [self.collectionView setContentOffset:CGPointMake(currentContentOffset.x,
                                                      currentContentOffset.y + 1.0f)
                                 animated:YES];
}

user2009606 estaba casi correcto, lo arreglé llamando

[refreshControl endRefreshing];

En

viewWillAppear:

El refreshControl ahora se comporta correctamente después de cambiar las pestañas, independientemente de su estado.





uirefreshcontrol