为啥我的 UILabel 变量总是为零?

Posted

技术标签:

【中文标题】为啥我的 UILabel 变量总是为零?【英文标题】:Why is my UILabel variable always nil?为什么我的 UILabel 变量总是为零? 【发布时间】:2016-02-15 18:57:19 【问题描述】:

我只是想用 Swift 中的 UILabel 连接一个变量。我看过很多教程,但我不断收到错误。主要原因似乎是@IBOutlet weak var str = UILabel! 始终为零。当我尝试为其分配一个值时,控制台会打印一个fatal error: unexpectedly found nil while unwrapping an Optional value,并且在编码界面内,self.stringLabel.text = self.string 行会突出显示错误Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0。这是我的代码:

@IBOutlet weak var stringLabel: UILabel!
var string: String!

override func viewDidLoad() 
    self.stringLabel.text = self.string
    super.viewDidLoad()


@IBAction func buttonClick(sender: UIButton) 
    self.stringLabel.text = "Button clicked!"

我尝试过在变量周围设置.self.text 的不同位置,但没有成功。我在正确的轨道上吗?而且,如果是这样,我做错了什么?如果我完全错了,如何将标签的文本设置为变量的文本?非常感谢您。

编辑:我已将情节提要中的标签连接到 @IBOutlet

e

【问题讨论】:

您的 UI 是如何构建的?你用故事板吗?如果是,您应该将标签从 UI 连接到 IBOutlet。否则这个问题将主要吸引“阅读手册”的答案。 您需要在访问它之前初始化您的字符串或将其声明为可选并使用零合并运算符?? "Default value" @Emet:请删除所有不需要的代码。我的意思是didReceiveMemoryWarningbuttonClickstring 属性。如果删除此代码后错误仍然存​​在,为什么将其放在这个问题中?它只会产生混乱。例如。我很确定string 属性与此错误 相关。因此,只需将其删除。 您的视图是否包含标签,由导航控制器提供服务?这个导航控制器是否与其目标视图具有相同的类?将返回零。更改要解决的类。 【参考方案1】:

stringLabel 属性未连接到 Interface Builder

您必须将 Interface Builder 中的 UILabel 对象连接到您的 Swift 代码中的属性。

    在 Xcode 中并排打开代表 UI 和 Swift 视图控制器的 xib/storyboard 在键盘上按住 ctrl 在 Interface Builder 中将指针移到 UILabel 对象上 按下指针按钮 将指针从 UILabel(接口生成器)拖到 Swift 源代码中声明 @IBOutlet weak var stringLabel: UILabel! 中的 UILabel! 部分

就是这样。

【讨论】:

@Emet:我仍然认为这是问题所在 :-) 请从 Interface Builder 中删除该对象,重新创建并重新连接它。【参考方案2】:

如果您在接口构建器中连接了 UILabel(确保是这种情况),但您的字符串对象未初始化,Cocoa 将处理您的 UILabel,您必须使用 var string: String = "" 分配它,或者如果您想使用可选的 @ 987654324@

您可以在全局范围内执行此操作,但我建议您的所有视图控制器都有一个 init() 方法来分配这些类型的东西。

编辑:我尝试重现问题,但得到了预期的结果。这是我的视图控制器代码

import UIKit

class ViewController: UIViewController 

    @IBOutlet weak var testLabel: UILabel!
    var string: String!

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        string = "Hello World"
    

    override func viewDidLoad() 
        self.testLabel.text = self.string
        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.
    

【讨论】:

您是说@IBOutlet weak var stringLabel: UILabel!var string: String! 应该在init() 方法中还是self.stringLabel.text = self.string 应该在init() 方法中——在viewDidLoad() 之外? 变量声明在哪里都很好,标签分配也很好,我只是说将变量初始化放在 init() 方法中是一个好习惯。比如:string = "" 这意味着您的 .swift 文件中的 UILabel 和 Interface Builder(或 Storyboard 中的图形化标签已断开连接)在您的 @IBOutlet weak var stringLabel: UILabel! 旁边您应该会在左侧看到一个小的空心圆圈.通过在 Assistant Editor 中打开 Interface Builder,将其单击并拖动到 Interface Builder 中的相应标签。按住 Alt 键单击 Main.Storyboard 以执行此操作。 @Emet 另外,你是如何分配这个字符串的?如果在初始化时没有设置,那么这个值可能应该被允许为nil,使用一个可选的(如string: String? = ...)这样你就可以在屏幕上得到一个空白标签而不会导致程序崩溃。检查是否是这种情况,将string = "" 替换为string = "test" @Emet:你能贴一张 Xcode 的截图,确切地说 stringLabel 被声明了吗?确保左侧的列是可见的。

以上是关于为啥我的 UILabel 变量总是为零?的主要内容,如果未能解决你的问题,请参考以下文章

类级变量集总是为零,为啥?

问题:我的非可选变量为零。 (展开时出现致命错误)

为啥带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束?

为啥在实施 NSCopying 时 zone 总是为零?

为啥在实施 NSCopying 时 zone 总是为零?

为啥约束总是为零,故事板是不是防止边缘?