ios - 初学者 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()
}
解决方案
你想要
将用户输入名称分配给下一个视图控制器上的标签。
但是您所有的标签和文本字段似乎都被声明为同一视图控制器上的插座。您不能像这样直接使用下一个/上一个视图控制器的插座。
您需要做的是收集第一个视图控制器中的所有 naem,将它们传递给下一个视图控制器并将它们设置为下一个视图控制器中的标签文本。如果您使用故事板和转场,您可以利用prepareForSegue:sender:方法来执行此操作。
既然你提到你刚刚开始,并且正在学习东西这里有一些关于在视图之间传递数据的在线教程:
- https://www.hackingwithswift.com/example-code/system/how-to-pass-data-between-two-view-controllers
- https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/
- https://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/
PS 这是一种非常基本的方法,但不推荐使用。视图转换和数据不应在同一代码中混合在一起。如果您打算使用它来构建强大的应用程序,那么开始学习 SOLID 原则和设计模式也是一个好主意。
推荐阅读
- java - 如何从 testng.xml 调用和重新运行特定的类
- android - 在Android中关闭应用程序安装“完成”/“打开”对话框
- html - @font-face 声明不遵循 fontspring 防弹语法错误
- awk - 在 gsub 中使用 awk 变量来计算行中的出现次数
- reactjs - 在 React-Phone-Input 2 中给出数字时,国家/地区代码不会改变
- javascript - 这里有解决此错误消息的方法吗?web3没有定义?
- php - 参数 #1 ($user) 必须是 Authenticable 类型,给定 null
- ios - iOS 应用程序中的音频会话路由处理
- python - 将整数列表转换为字节/ASCII字符串并返回?快速地?
- android-studio - 安卓设备连接ip失败