成功传递数据时应用崩溃

时间:2016-10-20 07:16:03

标签: swift swift3 ios10

我有一个简单的应用程序。将用户信息从1个视图控制器传递到另一个视图它成功打印出我的用户对象,我可以在控制台中看到数据,但是当我从对象中提取数据到我的视图中时它不显示

@IBOutlet weak var chatPartnerLabel: UILabel!

var user: User? {
    didSet {
        print(user) //This prints out all information fine
        chatPartnerLabel.text = user?.firstName //This crashes the app because chatPartnerLabel.text is nil
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    chatPartnerLabel.text = user?.firstName //This comes up as nil 
}

我也试过硬编码标签以确定它是否正常工作

chatPartnerLabel.text = "My text" //Changes the label to My Text

我也尝试将user?.firstName放在viewDidAppear中,viewWillAppear都显示空标签。

正如您在控制台中看到的,我的用户在那里有数据。我尝试设置时遇到的崩溃现在是nil

enter image description here

成功将chatPartnerLabel更改为名称或名字我做错了什么?

3 个答案:

答案 0 :(得分:0)

class User {
    var firstName = "fn"
}


///uiviewcontroller:


@IBOutlet weak var chatPartnerLabel: UILabel!
var user: User? {
        didSet {
            print(user) //This prints out all information fine
            chatPartnerLabel.text = user?.firstName //This crashes the app
        }
    }

两个

override func viewDidLoad() {
        super.viewDidLoad()
        user = User()

override func viewDidLoad() {
        super.viewDidLoad()
        chatPartnerLabel.text = user?.firstName

的工作!我已经过测试了!

我们需要更多信息和正确的callstack。展开时chatPartnerLabel可能是零。

答案 1 :(得分:0)

如果您在segue中设置user或在推送/呈现控制器之前,它将崩溃,因为标签尚未实例化。这就是为什么你必须将代码重写为:

@IBOutlet weak var chatPartnerLabel: UILabel! {
    didSet {
        print(user?.firstName) // just for check
        chatPartnerLabel.text = user?.firstName
    }
}

var user: User? {
    didSet {
        print(user) //This prints out all information fine
    }
}

答案 2 :(得分:0)

这适用于 Swift 3 。我添加了一个布尔控件来了解何时调用viewDidLoad。

var user: (firstName : String, lastName : String, controlView : Bool)? {
    didSet {

        if (self.user?.controlView)! {

        print(user!)
        chatPartnerLabel.text = user?.firstName
        }

    }

}


override func viewDidLoad() {
    super.viewDidLoad()

   user?.controlView = true
 }