2015-08-01 11 views
5

Attualmente sto cercando di presentare un controller di visualizzazione utilizzando un UIPresentationController. Il mio problema è, quando la mia transizione personalizzato delegato chiamaPresentazione del controller è Nill nel delegato di transizione

func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 

mio regolatore di presentazione è nil inducendolo un'eccezione. Lo sto presentando da un controller di visualizzazione incorporato in un controller di navigazione incorporato in un controller della barra delle linguette. Ho provato a presentarlo anche da questi controller allo stesso problema. Funziona anche correttamente quando non c'è una presentazione modale personalizzata ma il mio obiettivo è personalizzarlo. Lo chiamo quando viene selezionato un pulsante e il codice viene fornito di seguito. mapTransitionDelegate è il mio delegato di transizione personalizzato che conservo in una proprietà di classe. Inoltre, EnlargedMapViewController() viene inizializzato per avere una presentazione modale personalizzata in modo che venga chiamato il mio delegato di transizione.

var enlargedMapController = EnlargedMapViewController(); 
enlargedMapController.transitioningDelegate = mapTransitionDelegate; 
presentViewController(enlargedMapController, animated: true, completion: nil); 

Mi piacerebbe sapere perché questo problema si sta verificando per future conoscenze. A partire da ora, la sottoclasse UIPresentationController non è stata ancora inizializzata a causa di questa eccezione.

+0

è il 'EnlargedMapViewController' creato in Interface Builder? Se sì, è una trappola comune. Usa un 'IBOutlet' piuttosto che creare un'istanza al livello di programmazione. – vadian

+0

EnlargedMapViewController() viene creato tutto in codice. Tuttavia, la mia applicazione si basa su storyboard per lo più ad eccezione di questo controller di visualizzazione – user2532485

risposta

0

L'inizializzatore designato per UIViewController (e, a sua volta, le sue sottoclassi) è init(nibName:bundle:). Tuttavia, la documentazione specifica:

Questo è l'inizializzatore designato per questa classe. Quando si utilizza uno storyboard per definire il controller di visualizzazione e le relative viste, non si inizializza mai direttamente la classe del controller di visualizzazione. Invece, i registri di visualizzazione vengono istanziati dallo storyboard automaticamente quando viene eseguito un passaggio o programmaticamente quando l'app chiama il metodo instantiateViewControllerWithIdentifier: di uno oggetto storyboard . Quando si istanzia un controller di visualizzazione da uno storyboard , iOS inizializza il nuovo controller di visualizzazione chiamando il suo initWithCoder: metodo invece di questo metodo e imposta la proprietà nibName su un file di pennino memorizzato nello storyboard.

Chiamare EnlargedMapViewController() non è il modo giusto per andare perché ignora tutti i meccanismi necessari per Cocoa per trovare i pezzi. Dovresti istanziarlo da un pennino usando il suo inizializzatore designato o almeno facendo corrispondere il nome del suo pennino al suo nome di classe (cioè, EnlargedMapViewController.xib) così la tua chiamata a EnlargedMapViewController(nibName: nil, bundle: nil) (passando nil) farà in modo che Cocoa cerchi un pennino corrispondente per nome.

Ma in realtà, se stai usando gli storyboard ovunque, perché non anche qui? Basta impostare un identificatore per la sua scena e utilizzare instantiateViewControllerWithIdentifier: e godersi il tempo e l'esasperazione che hai salvato te stesso.

Problemi correlati