首页 > 解决方案 > 初学者 Swift:在尝试将文本分配给 UILabel 时,不断收到“在隐式展开可选值时意外发现 nil”

问题描述

我一直想写代码,刚开始利用空闲时间尝试学习,所以我知道的很少,但很想学习!也是第一次海报。我正在制作一个简单的骰子游戏应用程序,但我一直非常难以解开字符串和变量的包装。尝试将用户输入名称分配给下一个视图控制器上的标签时,我不断收到错误“在隐式展开可选值时意外发现 nil”。

让我知道这是否过于复杂的应用程序设计,但这就是我正在尝试设计的:第一个视图控制器,其中 2-4 名玩家输入他们的名字。他们点击下一个按钮,然后将他们带到下一个视图控制器,那里有骰子、滚动按钮和他们刚刚输入的名称。

我有正确连接到 IBOutlets 的名称的 UITextField 和 UILabel。我强制 UITextField 展开,将它们设为可选以防止应用程序崩溃,但名称仍未更新。这是我的代码:

class ViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

@IBOutlet weak var name1: UITextField!
@IBOutlet weak var name2: UITextField!
@IBOutlet weak var name3: UITextField!
@IBOutlet weak var name4: UITextField!
//connects name strings


@IBOutlet weak var dice1: UIImageView!
@IBOutlet weak var dice2: UIImageView!
@IBOutlet weak var dice3: UIImageView!
@IBOutlet weak var dice4: UIImageView!
//links dice images

@IBOutlet weak var name1Label: UILabel!
@IBOutlet weak var name3Label: UILabel!
@IBOutlet weak var name4Label: UILabel!
@IBOutlet weak var name2Label: UILabel!
//links name labels on second viewController

var diceArray = ["dice1", "dice2", "dice3", "dice4", "dice5", "dice6"]
//creates an array to set dice images
var randomArray = [0,0,0]
var randomDice1 : Int = 0
var randomDice2 : Int = 0
var randomDice3 : Int = 0
//creates variables to hold random number

func storeNames () {
    name1Label?.text = name1.text.   THIS IS WHERE I KEEP GETTING FATAL ERRORS
    name2Label?.text = name2.text
    name3Label?.text = name3.text
    name4Label?.text = name4.text
    //stores the user inputed names into an array
}
//stores the names from textfield into name strings
override func viewDidLoad() {
    super.viewDidLoad()

    Thread.sleep(forTimeInterval:0.25)
    //extends loading screen

    name1?.placeholder = "Player 1 Name"
    name2?.placeholder = "Player 2 Name"
    name3?.placeholder = "Player 3 Name"
    name4?.placeholder = "Player 4 Name"
    //Creates placeholder text

    let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))
    view.addGestureRecognizer(tap)
    //removes keyboard when you tap outside keyboard
}    
@IBAction func nextButton(_ sender: UIButton) {
        storeNames()

    }

标签: iosswiftxcode

解决方案


你想要

将用户输入名称分配给下一个视图控制器上的标签。

但是您所有的标签和文本字段似乎都被声明为同一视图控制器上的插座。您不能像这样直接使用下一个/上一个视图控制器的插座。

您需要做的是收集第一个视图控制器中的所有 naem,将它们传递给下一个视图控制器并将它们设置为下一个视图控制器中的标签文本。如果您使用故事板和转场,您可以利用prepareForSegue:sender:方法来执行此操作。

既然你提到你刚刚开始,并且正在学习东西这里有一些关于在视图之间传递数据的在线教程:

PS 这是一种非常基本的方法,但不推荐使用。视图转换和数据不应在同一代码中混合在一起。如果您打算使用它来构建强大的应用程序,那么开始学习 SOLID 原则和设计模式也是一个好主意。


推荐阅读