【问题标题】:App crash when successfully passing data成功传递数据时应用程序崩溃
【发布时间】:2016-10-20 07:16:02
【问题描述】:

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

@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

我在成功将我的 chatPartnerLabel 更改为姓名或名字时做错了什么?

【问题讨论】:

  • 检查您的 IBOutlet 与情节提要的连接
  • 在此处写入崩溃日志
  • @ÖzgürErsil IBConnection 很好,因为我可以编写文本并且它更新正确,但不是我的用户。
  • @Vyacheslav 当应用程序崩溃时显示“错误展开可选 NIL”,我假设这是因为我试图过早设置文本?
  • 如果您正在执行segue 并使用prepareForSegue 将数据传递给destinationViewController。您必须删除 didSet 属性观察者,因为当时 chatPartnerLabel 没有加载并链接到插座。您必须改为在 viewDidLoad 中分配标签。

标签: swift swift3 ios10


【解决方案1】:
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

工作!我已经测试过了!

我们需要更多信息和正确的调用堆栈。展开时可能是 chatPartnerLabelis nil。

【讨论】:

    【解决方案2】:

    如果您在 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
        }
    }
    

    【讨论】:

      【解决方案3】:

      这适用于 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
       }
      

      【讨论】:

        猜你喜欢
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多