2015-10-17 84 views
0

我的目標是更新UIViewController標籤的text xib文件的屬性。該標籤在UIView子類中用IBOutlet連接聲明。如何在iOS視圖中訪問我的視圖中的子類成員?

let myView = myClass() 
myView.myLabel!.text = "Hello!" 

該標籤似乎是nil。實際上,我收到以下運行時錯誤:fatal error: unexpectedly found nil while unwrapping an Optional value。如果我不打開可選件,程序將運行,但標籤不會更新其text。 如何避免我的應用程序標記標籤爲nil?

底線:如果我理解正確的是我必須聲明兩個UIViews在我UIViewController。一個加載筆尖,另一個只更新標籤。但它們都在同一個xib文件上運行。這是正確的方法嗎?

+0

你'viewDidLoad'後調用此? – Andy

+0

@安迪,正確。我也嘗試將'myView'變量設爲全局變量,然後更改'viewDidLoad'中的標籤。 – Cesare

+0

所以'myClass'是一個UIView子類,對吧? 'myLabel'是否在'myClass()'的init方法中實例化? – Andy

回答

1

The label is declared in the UIView subclass with a IBOutlet connection.

我相信你正在服用約myClass這裏這是UIView一個子類。如果您已將其添加到您的UIViewController的XIB中並通過IBOutlet連接,那麼您不需要在此重新初始化它let myView = myClass()

通過這樣做,您可以創建另一個對象,該對象不會在您的UIViewController中顯示,所以如果有效地更改此對象的UILabel屬性,則不會更改您的用戶界面。

當你正確連接的IBOutlet,它應該出現類似下面你迅速類文件:

@IBOutlet weak var myView : myClass? 

然後在你的viewDidLoad功能,您可以撥打self.myView.myLabel!.text = "Hello!"看到的變化。

編輯:發表評論OP:

要加載UIView使用下列內容:

self. myView = NSBundle.mainBundle().loadNibNamed("myXib", owner: self, options: nil)[0] as? myView 
+0

如果不將自定義的'UIView'鏈接到'UIViewController'上的'XIB'文件中,就無法創建'IBOutlet'。你有2個選項 - 1)拖放一個UIView到你的'ViewController'的'XIB'文件中,並將該類改爲'myView'。然後像我在文章中提到的那樣使用它。2)直接在ViewController的'loadView'函數中初始化你的自定義視圖,就像我在我編輯的文章中提到的那樣。然後將該視圖添加爲UIViewController視圖的子視圖。 – Abhinav

+0

感謝您的編輯。我做了你所說的,我全局聲明瞭'var myView:UIView!',然後在'viewDidLoad'中加載了xib文件(我使用了你發佈的代碼)。但是,我不能訪問子類的成員:'類型'UIView'的值沒有成員'myLabel'。 – Cesare

+0

你不應該聲明它的類型爲'UIView'。它必須是你自定義視圖的類型,因爲'myLabel'是你的自定義視圖的屬性,而不是'UIView',所以它應該看起來像'var myView:MyView!'。 – Abhinav

1

當您嘗試將文本設置爲"Hello!時,myLabel仍可能是nil。做一些日誌記錄來驗證這一點。

myLabel仍然是nil,因爲您的myView對象尚未從nib中加載它的視圖。您可以通過將其添加爲子視圖來強制執行此負載,然後將文本設置爲任何您喜歡的內容。

相關問題