2014-04-11 14 views
11

Desidero utilizzare uno UISearchDisplayController su UIViewController, che include uno UITableView.
Uso l'autolayout. Quando provo a mettere il SearchBar (_searchBar) nella tableHeaderView conErrore asserzione in - [UITableView layoutSublayersOfLayer:]

self.tableView.tableHeaderView = _searchBar; 

ottengo l'errore 'NSInternalInconsistencyException', la ragione: 'Auto Layout ancora necessaria dopo l'esecuzione -layoutSubviews. L'implementazione di UITableView di -layoutSubviews deve chiamare super. '

Disattivazione Autolayout, l'errore scompare, ma ho bisogno di Autolayout ...

appare l'errore, quando uso celle personalizzate o StandardCells ...

appare l'errore, quando il TableView ha nessuna riga ...

risposta

16

Come soluzione generale a questo problema, o almeno un modo di trovare la causa di esso:

  • Accendere eccezione punti di interruzione
  • sottoclasse UITableView e sovrascrivere layoutSublayersOfLayer:, semplicemente chiamando super
  • Esegui la tua app - ti fermerai con il tuo nuovo metodo
  • Nel debugger, digitare po [self _autolayoutTrace]

Questo ti mostrerà una stampa di ogni vista nella finestra, con il punto di vista in cui il layout automatico non è stato in grado di trovare una soluzione evidenziato da asterischi o AMBIGUOUS LAYOUT. Queste sono le opinioni di cui hai bisogno per indagare sui vincoli per.

+0

Nei progetti Swift: 'expr -l objC++ -o - [[UIWindow keyWindow] _autolayoutTrace] '(fonte: https://carpeaqua.com/2015/07/07/auto-layout-debugging-in-swift/) –

6

Quando si aggiunge una sottoview a UITableView ci sono alcuni requisiti specifici per la sottoview. Considera l'aggiunta della sottoview ad un'altra vista (superview) nel tuo controller invece di UITableView.

"Auto Layout still required after executing -layoutSubviews" with UITableViewCell subclass

+1

Come @Vladimir punta nella sua risposta, l'esecuzione automatica di una vista in una tabellaView probabilmente innescherà quell'errore (nella tabella stessa, o anche l'esecuzione automatica di una tabellaViewHeader/Footer). Proprio come una nota chiarificatrice, vedo che questo errore potrebbe non apparire per alcuni layout in iOS 8, ma apparirà sicuramente in iOS 7. – fbeeper