Swift:致命错误:在初始化 UIlabel 值时展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】Swift:致命错误:在初始化 UIlabel 值时展开可选值时意外发现 nil【英文标题】:Swift: fatal error: unexpectedly found nil while unwrapping an Optional value when initializing UIlabel value 【发布时间】:2015-09-17 07:49:30 【问题描述】:

我对 swift 很陌生(我通常使用 Java 和 C++ 编写代码),我正在构建我的第一个 ios 应用程序。 在这个应用程序中,我正在尝试创建一个选择器视图,问题是当我尝试将标签点的初始值设置为选择器视图(数组)中的第一项时,它会弹出错误

"致命错误:在展开 Optional 时意外发现 nil 价值”

这是我正在工作的代码

class ViewController: UIViewController, UIPickerViewDelegate


    @IBOutlet var usertypeLabel: UILabel!
    @IBOutlet var Picker: UIPickerView!
    var usertype_array = ["patient","nurse"]
    //var usertype: String!
    override func viewDidLoad() 

        // Do any additional setup after loading the view, typically from a nib.
        super.viewDidLoad()
        usertypeLabel.text = usertype_array[0] //THIS IS WHERE THE ERROR OCCURS
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
        return 1
    

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
        return usertype_array.count
    

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
        return usertype_array[row]
    

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
        var rowselected = usertype_array[row]
        usertypeLabel.text = rowselected        
    

知道为什么会发生错误吗?请注意,如果我删除那行代码,它仍然会运行。谢谢。

【问题讨论】:

贴出来的代码没有错。我认为错误在其他地方。即使是行 usertypeLabel.text = usertype_array[0] 也应该可以正常运行。 我猜你没有将你的 IBOutlet 与故事板中的标签联系起来 您是否在故事板中创建了标签并将其连接到 IBOutlet? 我控制将情节提要中的标签拖动到 Viewcontroler.swift 中的代码。我是否错过了将其连接到其他地方的任何步骤? 【参考方案1】:

您缺少UIPickerViewDataSource 并在此处添加:

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource

并在您的 viewDidLoad 方法中添加:

Picker.dataSource = self
Picker.delegate = self

这是您的完整工作代码:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource


    @IBOutlet var usertypeLabel: UILabel!
    @IBOutlet var Picker: UIPickerView!
    var usertype_array = ["patient","nurse"]
    //var usertype: String!
    override func viewDidLoad() 

        // Do any additional setup after loading the view, typically from a nib.
        super.viewDidLoad()
        Picker.dataSource = self
        Picker.delegate = self
        usertypeLabel.text = usertype_array[0] //THIS IS WHERE THE ERROR OCCURS
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
        return 1
    

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
        return usertype_array.count
    

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
        return usertype_array[row]
    

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
        var rowselected = usertype_array[row]
        usertypeLabel.text = rowselected
    

如果您的插座正确,它将正常工作。

查看THIS 示例了解更多信息。

【讨论】:

我尝试了您的代码,但在 Picker.dataSource = self 处出现错误。我不确定我是否错过了任何地方...... 感谢您的帮助 Dharmesh。抱歉,这听起来可能很愚蠢,但我该如何检查呢?我在情节提要中创建了选择器和标签,对于选择器,我转到连接检查器并将委托和数据源链接到视图控制器中的黄色按钮。然后我控制将这两个拖到 Viewcontroller.swift 是正确的方法和顺序吗?谢谢 这里是:s000.tinyupload.com/index.php?file_id=50687844781234858340 非常感谢您的帮助 Dharmesh。真的很感激。如果可能的话,我很想知道为什么会出现这个错误。

以上是关于Swift:致命错误:在初始化 UIlabel 值时展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil

致命错误:在展开可选值错误 Swift 时意外发现 nil

Swift 3:致命错误:Double 值无法转换为 Int,因为它是无限的或 NaN

使用 Swift 和 Parse 获取 Facebook UserData 时出现致命错误

在 Swift 中使用 UISlider 以编程方式更改 UILabel

如何解决问题 UIPickerView 致命错误:索引超出范围 [IOS Swift 5.1 Xcode 11.2]