2016-10-20 23 views
2

我有一個簡單的應用程序。表視圖將用戶信息從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中都顯示一個空的標籤。

正如你可以在控制檯中看到的,我的用戶在那裏有數據。我得到的崩潰時試圖設置爲即將到來的零

enter image description here

我在做什麼錯我chatPartnerLabel成功改變名稱或姓名?

+0

請與分鏡 –

+0

寫崩潰日誌這裏 – Vyacheslav

+0

@ÖzgürErsil的IBConnection優良的IBOutlet中連接,因爲我可以寫文字,並更新正確只是不能與我的用戶。 – user934902

回答

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 

工作!我測試過了!

我們需要更多的信息和正確的調用堆棧。可能是chatPartnerLabel在解包時爲零。

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 
    } 
} 
0

這工作斯威夫特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 
} 
相關問題