Swift: texto de etiqueta-> "error fatal: inesperadamente encontrado nulo mientras desenvuelve un valor opcional"
label null (5)
como dice en el título, estoy tratando de cambiar el texto de la etiqueta con el clic de un botón. El error aparece en la línea self.playerChoice.text = "You: Rock"
import UIKit
class ViewController: UIViewController {
var player : Int = Int()
@IBOutlet weak var readyLabel: UILabel!
@IBAction func noButton(sender: AnyObject) {
exit(0)
}
// ---------------------------------------------------------
@IBOutlet var computerChoice: UILabel!
@IBOutlet var playerChoice: UILabel!
@IBOutlet var score: UILabel!
// Variables -------------------------------------------------
let Rock : String = "Rock"
let Paper : String = "Paper"
let Scissors : String = "Scissors"
//------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
// ----------------------------------------------------------------
@IBAction func rockButton(rockbut: UIButton) {
player = 0
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Rock"
}
@IBAction func paperButton(paperbut: UIButton) {
player = 1
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Paper"
}
@IBAction func scissorsButton(scissorsbut: UIButton) {
player = 2
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Scissors"
}
}
Parece que la elección del jugador no se ha inicializado.
@IBOutlet var playerChoice: UILabel!
Quizás la conexión entre la salida y InterfaceBuilder / Storyboard se pierde. Intenta conectarlo de nuevo.
Creé una pequeña demostración y todo funciona bien:
Verifique si los círculos en el lado izquierdo de su IBOutlet están llenos. De lo contrario, la conexión se pierde.
He intentado este código y funciona bien para mí:
class ViewController: UIViewController {
var player : Int = Int() //Declare this globally
@IBOutlet weak var readyLabel: UILabel!
@IBAction func noButton(sender: AnyObject) {
exit(0)
}
// ---------------------------------------------------------
@IBOutlet var computerChoice: UILabel!
@IBOutlet var playerChoice: UILabel!
@IBOutlet var score: UILabel!
// Variables -------------------------------------------------
let Rock : String = "Rock"
let Paper : String = "Paper"
let Scissors : String = "Scissors"
//------------------------------------------------------------
@IBAction func rockButton(rockbut: UIButton) {
player = 0
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Rock"
}
@IBAction func paperButton(sender: UIButton) {
player = 1
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Paper"
}
@IBAction func scissorsButton(sender: UIButton) {
player = 2
var ai = arc4random_uniform(3)
self.playerChoice.text = "You: Scissors"
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var p : String = "Undecided"
if (player == 0) {
var p: String = "Rock"
} else if (player == 1) {
var p: String = "Paper"
} else if (player == 2) {
var p: String = "Scissors"
}
}
}
Me encontré con este problema y resultó que las etiquetas que estaba tratando de editar no existían en el momento en que se ejecutó el código.
Resulta que estaba haciendo referencia al mismo controlador de vista desde una vista principal y una vista de contenedor secundario. Las etiquetas que intentaba cambiar solo estaban en la vista de contenedor, pero cuando ambas vistas se cargaron, ejecutó el controlador de vista para ambas, por lo que intentó encontrar las etiquetas que no existían en la vista principal y arrojó el error anterior.
Entonces la lección que aprendí ... Si una referencia a un objeto de vista arroja un NIL ...
- La Vista no está correctamente asignada al Controlador de Vista.
- El objeto dentro de la vista no está asignado a IBOutlet de referencia.
- O como en mi caso, hay múltiples vistas conectadas al mismo Controlador de Vista y las referencias para ver objetos en una vista no se encuentran en la otra.
Lo que solucionó esto en mi caso (y siempre me afecta, especialmente cuando eres nuevo en el uso de guiones gráficos) es asegurarte de que estás inicializando tu controlador de visualización de la siguiente manera:
slideShowVC = (UIStoryboard(name: "Main",bundle: nil).instantiateViewControllerWithIdentifier("WWPhotoSlideShowVC") as! WWPhotoSlideShowVC)
en lugar de la forma independiente xib:
slideShowVC = WWSlideShowVC()
O bien, todos sus puntos de venta serán nil na muchos dolores de cabeza pronto seguirán.
Me encontré con el mismo problema en Xcode 6.2. Yo uso XIB individuales en lugar de guiones gráficos. El problema para mí fue que con Swift, Xcode no asocia automáticamente el XIB con el controlador de vista si los nombres son los mismos. Por lo tanto, los IBOutlet para las etiquetas apuntan a cero dando el fatal.
Puede cambiar el viewcontroller.xib para que se llame nombremódulo.viewcontroller.xib para que xcode pueda asociarlo con el controlador de vista y el problema desaparezca.
Se mencionan más opciones en este hilo:
No se puede cargar el archivo XIB de UIViewController en Storyboard en Swift