2015-11-19 3 views
9

Sto usando un UIAlertController per prendere l'input dell'utente e aggiornare una cella di tabella. Ogni volta quando si tenta di creare un allarme, ho questa seguente avviso nella consoleUIAlertController: UICollectionViewFlowLayout non è definito avviso ogni volta che provo a richiamare un UIAlertcontroller

2015-11-19 17: 51: 42,034 SimpleTableView [5488: 584.215] il comportamento del UICollectionViewFlowLayout non è definito perché:

2015-11-19 17: 51: 42.035 SimpleTableView [5488: 584215] l'altezza dell'elemento deve essere inferiore all'altezza di UICollectionView meno la sezione inserisce i valori superiore e inferiore, meno il contenuto inserisce i valori superiore e inferiore.

2015/11/19 17: 51: 42,036 SimpleTableView [5488: 584.215] L'istanza UICollectionViewFlowLayout rilevante è < _UIAlertControllerCollectionViewFlowLayout: 0x7fd0a057c3d0>, ed è collegato a; layer =; contentOffset: {0, 0}; contentSize: {0, 0}> layout vista collezione: < _UIAlertControllerCollectionViewFlowLayout: 0x7fd0a057c3d0>. 2015-11-19 17: 51: 42.036 SimpleTableView [5488: 584215] Crea un punto di interruzione simbolico in UICollectionViewFlowLayoutBreakForInvalidSizes per rilevare ciò nel debugger.

l'implementazione è piuttosto semplice come accennato in numerosi blog,

func displayAlertInfo(){ 
    let alertController = UIAlertController(title: "New Race", message: "Type in a new race", preferredStyle: .Alert) 
    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (_) in 
     alertController.dismissViewControllerAnimated(true, completion: nil) 
    } 
    let addAction = UIAlertAction(title: "Add", style: .Default) { (_) in 
     let textFieldInput = alertController.textFields![0] as UITextField 
     let newRace = textFieldInput.text?.capitalizedString 
     DataManager.sharedInstance.addRace(species: self.species, race: newRace!) 
     let newIndexPath = NSIndexPath(forRow: self.races.count - 1, inSection: 0) 
     self.racesTableVew.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
    } 

    alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in 
     textField.placeholder = "New Race" 
    } 

    alertController.addAction(cancelAction) 
    alertController.addAction(addAction) 

    self.presentViewController(alertController, animated: true, completion: nil) 
} 

Io chiamo questa funzione su un rubinetto pulsante di navigazione. L'avviso viene visualizzato correttamente, ma continuo a ricevere questo avviso ogni volta che tento di toccare il pulsante che crea l'avviso. Cosa sto sbagliando o sto saltando qualcosa?

MODIFICA: Aggiunto Screenshot: L'avviso viene chiamato dal pulsante della voce di navigazione, su un TableView.

enter image description here

+0

Hai qualche soluzione? –

+0

No. Arriva ancora. –

risposta

13

è necessario chiamare

alertcontroller.view.setNeedsLayout() 

destra prima

self.presentViewController(alertController, animated: true, completion: nil) 

Fonte: https://forums.developer.apple.com/thread/18294 (ultima risposta)

+0

Non ha funzionato per me. Il mio è Xcode 7.3.1. – triiiiista

+0

Grazie a @Mak, i ragazzi si assicurano di chiamare su 'alertcontroller' invece di' UIViewController' object. –

2

Ho avuto un problema simile: ha funzionato bene su iPhone 6 Più ritratto, fallito in orizzontale. Ho fatto un piccolo cambiamento: da

message: nil, 

a:

message: "this is a nice long line of crapthis is a nice long line of crapthis is a nice long line of crap", 

..che era abbastanza a lungo per avvolgere, l'aggiunta di due nuove righe. E il mio problema è stato risolto. Ma un messaggio più breve che non ha eseguito il line-wrap almeno due volte ha comunque causato l'errore.

Ho poi scoperto che

message: "\n\n" 

funzionato altrettanto bene, ma un messaggio di un singolo newline fallito. E se avessi impostato il titolo: nil, avevo bisogno di più newline nel messaggio. Sembra essere correlato all'altezza totale dell'avviso, titolo e messaggio combinati.

Nota: altri avvisi senza campo di testo non hanno mostrato lo stesso problema. E nel mio caso, setNeedsLayout() non ha fatto alcuna differenza.

(Naturalmente, aggiungendo che molte linee rendono l'avviso troppo alto per apparire sugli iPhone più piccoli in orizzontale una volta che si include la tastiera pop-up, generando lo stesso flusso di messaggi di errore. linee condizionali per l'altezza e la larghezza dello schermo maggiore di un valore impostato.)

+0

Non ha funzionato per me. Il mio è Xcode 7.3.1. Il dispositivo è iPhone 6 plus. – triiiiista

+0

XCode 7.3.1 potrebbe aver rotto qualcosa. Sto ancora usando 7.3 mentre sono nel bel mezzo di un progetto; non ho ancora provato 7.3.1. –

+0

Funziona ancora per me con XCode 7.3.1 e iOS 9.3.2. L'unica volta che vedo il messaggio è quando ruoto uno schermo piccolo (iPhone 4S e 5) da verticale a orizzontale con l'avviso e la tastiera visualizzati: l'avviso (con titolo ma nessun messaggio) che si adatta bene quando inizialmente visualizzato il panorama o il ritratto viene incasinato nella rotazione di nuovo in orizzontale, con il titolo e il campo di immissione che vengono spostati verso l'alto nella parte superiore dell'avviso (e rimangono così se vengono nuovamente ruotati in verticale). Ruotro di nuovo in orizzontale, titolo e campo di immissione si spostano nuovamente nelle loro posizioni appropriate. –

1

Avevo anche lo stesso problema nel mio schermo solo per schermo iphon6 plus. Si prega di verificare, se non sta passando titolo vuoto, se il titolo è vuoto, passare nil come:

UIAlertController *confirmAlert = [UIAlertController alertControllerWithTitle:nil message:displayMessage preferredStyle:UIAlertControllerStyleAlert]; 

invece di

UIAlertController *confirmAlert = [UIAlertController alertControllerWithTitle:@"" message:displayMessage preferredStyle:UIAlertControllerStyleAlert]; 

è risolto il mio problema. Buona fortuna ..