2014-12-09 16 views
5

Ho uno UIViewController che ha uno UITableView e uno UISegmentedControl con 4 segmenti in esso. Ogni volta che l'utente tocca un segmento diverso, il tipo di celle mostrato nella vista tabella dovrebbe cambiare. Per fare questo, ho il seguente codice:UITableView non si ricarica correttamente su iOS 7.1

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [self.tableView reloadData]; 
} 

Di solito, il terzo segmento popola la vista tabella con il maggior numero di cellule. Così, mentre sul terzo segmento, quando ho scorrere fino alla parte inferiore della tabella e quindi passare a un altro segmento, mi aspetto che la vista tabella per ricaricare solo le sue cellule e rimanere nella stessa posizione di scorrimento. Tuttavia, ciò che accade è che la vista dell'intestazione sembra essere posizionata nella parte inferiore dello schermo come se la vista della tabella fosse scorsa verso l'alto fino ai suoi limiti. Quindi, quando tocco e ricomincio a scorrere, le cose tornano alla normalità come se il tavolo fosse stato fatto scorrere verso il basso e le celle fossero visualizzate.

Ho cercato di risolvere questo problema per un po 'di tempo ed i posti che ho visto fino ad ora tutto ha suggerito la stessa cosa. Hanno detto che se l'animazione è gestita in un thread diverso dal thread principale, questo tipo di problemi era inevitabile. Così ho provato modificando il codice come qui di seguito:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
} 

e:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [self.tableView reloadData]; 
    }]; 
} 

Nessuno di loro ha lavorato. Ho anche provato a scorrere la vista della tabella in modo programmatico dopo aver ricaricato bu che non sembrava funzionare.

Qualcuno ha altre idee perché questo potrebbe accadere? Devo notare che questo problema si verifica solo su iOS 7.1.

+0

Hai provato ricaricare una sola cella, invece di tutta la tabella con reloadRowsAtIndexPaths: withRowAnimation :? –

risposta

1

A quanto mi risulta, si stanno ottenendo soltanto la questione durante la transizione da filtro indice controllo segmentato con il maggior numero di risultati.

Quando si è tentato lo scorrimento della visualizzazione della tabella di programmazione dopo la ricarica, ha di calcolare quale il percorso dell'indice sarebbe per il risultato obiettivo fissato per il controllo segmentato 1 o 2?

Esempio:

Se ci stiamo muovendo da segmentedControlIndex 3-1 in cui 3 ha 30 record e 1 ha 10 record:

[self.tableView reloadData] 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:10 inSection:0]; 
[self.tableView scrollToRowAtIndexPath:indexPath 
       atScrollPosition: UITableViewScrollPositionBottom 
         animated:YES]; 

È possibile che questo patto di avere 1 sezione.

Problemi correlati