初学者 Swift:尝试将文本分配给 UILabel [重复]

Posted

技术标签:

【中文标题】初学者 Swift:尝试将文本分配给 UILabel [重复]【英文标题】:Beginner Swift: Keep getting "Unexpectedly found nil while implicitly unwrapping an Optional value" while trying to assign text to a UILabel [duplicate] 【发布时间】:2020-06-05 01:10:06 【问题描述】:

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

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

我有正确连接到 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()

    

【问题讨论】:

你在哪里打电话给storeNames 底部有一个IBAction函数我忘记复制了。它只是调用 storeNames 并连接按钮以将您带到情节提要中的下一个 viewController 这个崩溃意味着有东西是nil。它几乎总是一个连接错误的插座。在storeNames设置断点,看看nil是什么 【参考方案1】:

你想要

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

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

您需要做的是收集第一个视图控制器中的所有 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/

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

【讨论】:

以上是关于初学者 Swift:尝试将文本分配给 UILabel [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将文本分配给UILabel(iOS,Swift 4,Xcode 9)时内存泄漏

将一个数组分配给另一个数组c ++ [重复]

解析 JSON 后将文本分配给 UILabel 会出错

如何在javascript中将文本分配给标签?

将字符串数组分配给二维字符串数组

Perl:将数组分配给哈希