2014-07-25 14 views
12

Sto cercando di eseguire questo codice, ma io continuo a questo errore:errore fatale: inaspettatamente trovato nulla, mentre scartare un valore opzionale

fatal error: unexpectedly found nil while unwrapping an Optional value

Non capisco cosa significhi o perché mi sto esso. Qualche suggerimento?

import UIKit 

class ViewController: UIViewController { 

var lastNumber: String = "" 
@IBOutlet var answerField: UILabel 
@IBOutlet var operaterLabel: UILabel 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func buttonTapped(theButton: UIButton) { 
    if answerField.text == "0" 
    { 
     answerField.text = theButton.titleLabel.text 
    } 
    else 
    { 
     answerField.text = answerField.text + theButton.titleLabel.text 
    } 
} 

@IBAction func plusTapped(theButton: UIButton) { 
    // error is talking about the next line 
    if operaterLabel.text == "" 
    { 
     operaterLabel.text = "+" 
     lastNumber = answerField.text 
     answerField.text = "0" 
    } 
    else 
    { 
     enterTapped(nil) 
     operaterLabel.text = "+" 
    } 

} 

@IBAction func minusTapped(theButton: UIButton) { 
    if operaterLabel.text == "" 
    { 
     operaterLabel.text = "-" 
     lastNumber = answerField.text 
     answerField.text = "0" 
    } 
    else 
    { 
     enterTapped(nil) 
     operaterLabel.text = "-" 
    } 

} 

@IBAction func clearTapped(AnyObject) { 
    answerField.text = "0" 
    operaterLabel.text = "" 
    lastNumber = "" 

} 

@IBAction func enterTapped(AnyObject?) { 

    var num1 = lastNumber.toInt() 
    var num2 = answerField.text.toInt() 
    if !num1 || !num2 
    { 
     showError() 
     return 
    } 
    var answer = 0 
    if operaterLabel.text == "-" 
    { 
     var answer = num1! - num2! 
    } 
    else if operaterLabel.text == "+" 
    { 
     var answer = num1! + num2! 
    } 
    else 
    { 
     showError() 
     return 
    } 
    answerField.text = "\(answer)" 

} 

func showError() 
{ 
    println("Ther was an error") 
} 
} 
+1

A quale riga viene eseguito XCode nell'errore? – jmduke

+0

Questa riga: if operaterLabel.text == "" @jmduke – Arshia

+1

Questo deve essere stato chiesto più volte di "Come posso passare i dati tra i controller di visualizzazione?" :-) –

risposta

15

l'errore si riferisce al fatto che si sta accedendo al parametro di un valore facoltativo quando il valore opzionale viene impostato a zero (ad esempio l'accesso ai answerField.text quando answerField è pari a zero), probabilmente uno dei due UILabels.

Se la riga operaterLabel.text == "" lancia l'eccezione, il numero operaterLabel è nullo. Verificare di averlo collegato correttamente all'etichetta nel file di Interface Builder.

+1

Quindi se l'erorr sta evidenziando questo: if operaterLabel.text == "" in fuction plusTapped qual è il problema – Arshia

4

controllare i punti vendita, ho avuto questo prima di etichette e pulsanti può solo diventare DIS collegati (vincoli se per esempio si è regolato ect)

una semplice connessione re a volte può risolvere il problema

+0

Puoi farlo aprendo il file storyboard e aprendo l'ispettore connessioni nel pannello utility (cerchio con destra icona della freccia). Le connessioni sono elencate (e possono essere create) sotto la sezione "Referencing Outlets" (XCode 7.1). –

1

Quello significa che lo storyboard non ha un link al tuo IBOUTLET, verifica

2

Ho avuto lo stesso errore e ho trascorso una quantità di tempo indefinita debuggandolo. Quello che @jmduke ha detto è davvero la chiave: dove si verifica l'errore?

Con il mio errore particolare, guardando mi ha guidato sulla strada giusta. Ho effettuato l'accesso allo operaterLabel.text mentre la vista non era ancora completamente inizializzata. Nel mio caso specifico ho impostato una variabile da una vista diversa durante una sequenza e poi ho agito in base alla variabile impostata e aggiornando un'etichetta all'interno della vista. Tuttavia, la vista non è stata completamente inizializzata.

Quindi la mia soluzione era aggiornare l'etichetta all'interno della funzione viewDidLoad().

6

Nel mio caso, stavo cercando di accedere alle etichette in una funzione che ho creato che è stata utilizzata dopo l'insieme di una variabile.

var something: String { 
    didSet { 
     updateUI() 
    } 
} 

func updateUI() { 
    label.text = "Hello" 
} 

ho risolto da:

var something: String 

override func viewDidLoad() { 
    label.text = "hello" 
} 

mia teoria è che la mia funzione updateUI si accedeva prima che i punti di vista e le etichette sono state create.

0

Ho avuto questo errore e il mio problema è stato causato dall'aggiunta di un membro (chiamiamolo nuovaProperty) alla mia classe modello, quindi cercando di eseguire un progetto che caricava i dati con NSCoder.decodeObjectForKey (newPropertyKey). Durante i test precedenti, avevo salvato oggetti senza newProperty, quindi quando l'app ha provato a chiamare decodeObjectForKey (newPropertyKey) sui miei vecchi dati, Xcode ha risposto con questo messaggio di errore.

1

Se vi assicurate il xib per il tuo cellulare non è un problema,

Poi ho verificarsi questo problema, il mio errore è stato registrare il metodo di cell:

1)

self.tableView.register(TerantInfoTabCell.self, forCellReuseIdentifier: "TerantInfoTabCell") 

2)

self.tableView.register(UINib(nibName:"TerantInfoTabCell", bundle: nil), forCellReuseIdentifier: "TerantInfoTabCell") 

Io uso il primo metodo, ci wi Apparirà il problema, quindi uso il metodo 2) sostituisce il 1), quindi non ci sono problemi qui.

1

alcune volte il problema che si deve avviare vista controller prima presente in questo modo:

let myViewController = MyViewController() 

sostituirlo con

let myViewController = self.storyboard?.instantiateViewController(withIdentifier: "storyboardID") as! MyViewController 
0

Questo errore si verifica in genere perché cerchiamo di cambiare il testo UILabel dopo la la vista è stata caricata Ricorda che UILabels una volta caricato nella vista non può essere modificato in alcun modo in cui possono essere impostati solo all'interno della funzione viewdidload(). Puoi verificarlo inserendo il tuo codice di assegnazione del testo nella funzione viewDidLoad() che imposterà UILabels durante il caricamento della vista, funzionerà. Ma ora se la tua applicazione è costruita in modo tale da impostare UILabels dopo che la vista è stata caricata, l'unica soluzione è che dovrai creare UILabels in modo dinamico/programmatico dove vuoi nel codice e assegnare quello che vuoi perché saranno creati/istanziati con quel testo/etichetta.

Problemi correlati