2013-09-24 13 views
5

In iOS 6, ho avuto un UITableView creato utilizzando QuickDialog nella mia app. Scorreva normalmente. Quando sono passato a iOS 7, lo stesso UITableView non scorre correttamente. Posso trascinare verso il basso (lo scroller si comprime) ma quando rilascio, si apre di nuovo verso l'alto. Ho giocato con viewDidAppear per provare e diagnosticare il problema. Vedi il blocco di codice qui sotto.UITableView non esegue lo scorrimento dopo il passaggio a iOS 7

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView reloadData]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView layoutIfNeeded]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
} 

L'uscita di questo blocco in iOS 7 è

Content height: 0.000000 
Content height: 836.000000 
Content height: 0.000000 

Nel frattempo, l'uscita di questo blocco in iOS 6 (simulatore) è

Content height: 836.000000 
Content height: 836.000000 
Content height: 836.000000 

anche per cercare e diagnosticare la problema, ho impostato un pulsante che avrebbe attivato [self.quickDialogTableView reloadData]. Ogni volta che il pulsante viene premuto, il comportamento di scorrimento inizia a funzionare normalmente. Quindi quando esco dalla vista e torno indietro, lo scorrimento fallisce nuovamente (fino a quando il pulsante non viene premuto). Per essere chiari, ho provato a inserire un valore in viewWillAppear da solo (ovvero rimuovere le ultime due righe nel blocco di codice sopra) e non corregge lo scorrimento.

Sto cercando degli indizi su dove potrei cercare di correggere il problema. Grazie in anticipo per qualsiasi aiuto.

risposta

7

Ok, quindi non sono riuscito a capire la causa del problema, ma ho trovato una soluzione che spero possa aiutare qualcun altro. O almeno, forse aiuta qualcun altro a sottolineare cosa c'è di veramente sbagliato.

Ho creato una proprietà denominata trueContentSize dove memorizzo le dimensioni corrette.

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.quickDialogTableView reloadData]; // Calculates correct contentSize 
    self.trueContentSize = self.quickDialogTableView.contentSize; 
} 

Poi, in -viewDidLayoutSubviews mi correggere il contentSize manualmente.

-(void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    self.quickDialogTableView.contentSize = self.trueContentSize; 
} 
+0

Questo non sembrava che avrebbe funzionato, e abbastanza sicuro, non ha funzionato per me. Sto affrontando lo stesso problema, tuttavia, nella tua soluzione stai semplicemente prendendo il contentSize da quickDialogTableView in viewDidAppear: e poi riassegnandolo nuovamente a contentSize di quickDialogTableView di nuovo in viewDidLayoutSubviews ... Non riesco a capire come sarebbe risolto il problema. – Jamornh

+1

@Jamornh Concordato. Non ha alcun senso. Tuttavia, se registro 'self.quickDialogTableView.contentSize' in' -viewDidLayoutSubviews' prima di 'self.quickDialogTableView.contentSize = self.trueContentSize;' risulta essere zero. Quindi qualcosa sta accadendo tra '-viewDidAppear' e' viewDidLayoutSubviews' che sta impostando 'contentSize' su zero. Non ho idea di cosa. Siamo spiacenti di sentire che il mio trucco non ha funzionato per te. Hai controllato per assicurarti che la tua proprietà 'self.trueContentSize' personalizzata restituisse la dimensione prevista prima di usarla? –

+0

Sono riuscito a risolvere il problema reimpostando manualmente i frame ei limiti della superview di tableView, quindi reimpostando il frame di tableView per adattarlo in modo che contentSize di tableView sia più grande della sua cornice. Apparentemente lo scorrimento non funzionava perché il frame di tableView è più grande di contentSize per qualche motivo. Grazie per la risposta! – Jamornh

0

Di fronte allo stesso problema, l'unica soluzione trovata era di ricaricare i dati nella tabella. Spero possa aiutare.

1

Questa è la mia attuale soluzione temporanea. Qualcuno capisce la vera soluzione?

@interface UITableView (Extension) 
@end 

@implementation UITableView (Extension) 

- (void)setContentSize:(CGSize)contentSize { 
    if (contentSize.height != 0) { 
    [super setContentSize:contentSize]; 
    NSLog(@"set content height %f", contentSize.height); 
    } else { 
    NSLog(@"set content size zero"); 
    } 
} 

@end 
3

Proprio pensato che avrei potuto gettare i miei due centesimi qui ..

Stesso problema stava accadendo a me. La tabella si carica bene all'inizio, ma passa a una schermata diversa, torna indietro e la vista tabella contentSize è 0,0 e non convertibile. Anche la soluzione di Fausto non stava funzionando in modo affidabile.

Quello che è risultato essere il mio caso era solo l'atto di fare riferimento a topLayoutGuide in -viewWillLayoutSubviews. Fare ciò provoca tutti i suddetti sintomi. Provalo in un nuovo progetto:

  1. Imposta un controller di visualizzazione tabella in un controller di schede.
  2. Assegnare 30 righe con solo contenuto statico.
  3. Esegui e puoi scorrere. Scambia le schede, quindi torna indietro e puoi scorrere.
  4. Aggiungi in -viewWillLayoutSubviews
  5. Eseguire di nuovo, è possibile scorrere, ma passare schede, non più scorrimento.

Strano. Sembra un bug iOS, o semplicemente non si dovrebbe fare riferimento a topLayoutGuide in quel metodo. La rimozione di qualsiasi riferimento a quella proprietà risolverà il problema.

Modifica: Come all'inizio dell'anno, Apple ha confermato tramite un report Radar che ho fatto un bug iOS. Non fare riferimento a topLayoutGuide finché non è stato risolto (ogni volta che lo sarà, heh). :)

+0

Stesso problema! Solo commentando topLayoutGuide lo scorrimento delle chiamate ha funzionato bene ... – Cemen

+0

Trovato un rimedio: Sostituisci 'UITableViewController' con un semplice' UIViewController'. Qui: http://stackoverflow.com/questions/19595479/calling-toplayoutguide-breaks-scrolling-altogether – Cemen

0

Ho avuto un problema simile. Il mio problema era che avevo impostato un'altezza esplicita per la vista tabella nello storyboard. L'aggiornamento della vista tabella per utilizzare il layout automatico impostando la distanza dalle viste sopra/sotto ha funzionato per me.

Problemi correlati