2014-09-05 15 views
9

Ho appena installato XCode6 Beta-7 e sto vedendo ora un'eccezione di accesso su uno dei miei metodi PrepareForSegue - (chiamato quando un modale Segue sta per rilassarsi)xcode6 beta7 prepareForSegue getta EXC_BAD_ACCESS

Il codice in questione assomiglia a questo:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 


    if (segue.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0) 
     //Never gets here... 
    } 


} 

ho provato a fare il parametro segue un optional ma per quanto Swift è interessato, segue non è pari a zero, quindi anche con un assegno come il sotto, ho lo stesso errore ..

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) { 

    if (segue != nil) 
     if (segue!.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0) 
      //Never gets here... 
     } 
    } 


} 

Tutti gli altri seguiti dell'applicazione sembrano funzionare correttamente, ma questo non funziona, e sembra che si verifichino solo nel caso di uno svolgimento. Qualcun altro ha incontrato questo?

EDIT/Soluzione

Una soluzione semplice è quella di evitare di utilizzare il metodo di unwindSegue e semplicemente chiamare dismissViewControllerAnimated, ma mi piacerebbe ancora l'amore di sapere il motivo per cui il metodo unwindSegue sta fallendo in questo caso ...

Mille grazie!

+0

Solo un pensiero: hai pulito la tua cartella di build dopo l'aggiornamento a Beta 7? – zisoft

+0

Mmm .. non ho fortuna neanche con il pulito. (buon promemoria però - che mi ha sorpreso anche con alcune delle precedenti beta :)) – Nash

+3

Ho avuto un problema simile con un seguito. Prova questo: per ogni passaggio in Interface Builder che hai * * non ha un identificatore, digita qualcosa, rimuovilo, quindi premi Invio. Quindi ricostruisci e riprova. Avevo un seguito senza identificatore che avevo aggiunto in una beta precedente, ed era quello che stava causando il problema. Forzando di reimpostare l'identificatore * di nuovo * nell'ultimo Xcode, credo di aver cambiato qualcosa nello xib che doveva corrispondere esattamente al codice di runtime nell'ultima beta. –

risposta

14

Come Matt Gibson ha capito aggiungendo e rimuovendo l'identificatore di seguito risolve il problema.

Il motivo del bug è che Xcode per impostazione predefinita non aggiunge un identificatore per i segui di svolgimento.

La segue rilassarsi default nella storyboard assomiglia a questo:

<segue destination="foo" kind="unwind" unwindAction="unwind:" id="bar"/> 

in Objective-C questo non era un problema, segue.identifier sarebbe nullo. In Swift identifier viene dichiarato come String, una stringa non facoltativa. Ma l'identificatore è ancora nullo nello storyboard, quindi l'SDK restituisce nil dove dice che restituisce una stringa non facoltativa. Questo si arresta in fase di runtime.

Una volta modificato e rimosso l'identificatore nello storyboard, l'identificatore sarà "", una stringa vuota.

<segue destination="foo" kind="unwind" identifier="" unwindAction="unwind:" id="bar"/> 

Che naturalmente risolve il problema, perché una stringa vuota corrisponde al valore di ritorno specificato del identifier getter.

Ho archiviato uno radar per questo. Dovresti duplicarlo in Apples Bug Reporter

+0

Cool, felice che stavo indicando nella giusta direzione. Grazie per aver approfondito ciò che accade dietro le quinte. –

+0

Per aggiungere a questo, il seguito che stavo usando non era il problema in quanto aveva definito un identificatore. Il mio problema era che un altro passo nello storyboard non aveva un identificatore. –