2011-06-03 81 views
7

爲什麼IBOutlet(連接的)可能是nil的原因是什麼?IBOutlet無效的原因

我有一個在可能的應用程序,總是nil,即使我從零開始重新創建(聲明和控制)。

回答

4

這可能是你的筆尖混亂了,但我發現一個常見的原因是有兩個實例,你認爲你只有一個實例,而你在代碼中使用的實例不是你連接的實例。

+1

「兩個實例」場景的一個常見原因是在代碼中創建控制器實例,並在加載筆尖時使其成爲筆尖的所有者。然後,在IB中創建另一個控制器實例並連接到該網點,而不是「文件所有者」。 – 2011-06-03 12:23:20

+0

或者,在另一個筆尖中創建一個實例,然後將其中一個實例掛鉤,並發現該插口在另一個筆記本中爲「nil」。另一種可能性是,您只創建了一次對象,但尚未加載它將是所有者的筆尖。 – 2011-06-04 01:45:35

2

如果您還定義了創建視圖的loadView方法,可以根據初始化方法進行。如果使用alloc-init對它初始化,並且nib名稱與類名稱不同,那麼可以有一個情況,即插座爲零。但查克的回答似乎更合理的假設。

0

一種可能性: 假設IBOutlet中的容器是一個像一個功能一個單獨的對象:

+ (singletonObject*) sharedInstance { 
    if(!gGlobalSingletonPointer) { 
     gGlobalSingletonPointer = [[singletonObject alloc] init]; 
    } 

    return gGlobalSingletonPointer; 
} 

你「按需」創建單獨的對象,如果它不存在。 您可以在該函數中爲其創建一個全局指針。

如果您還在InterfaceBuilder中實例化了這樣一個對象,並連接其插座,則將創建該對象而不調用 sharedInstance。如果您隨後調用sharedInstance,則會創建一個新的對象(sans IBOutlet連接)。

解決的辦法是更新singletonObject的init或awakeFromNib函數中的全局指針。

0

您使用的是UINavigationController嗎?
如果是這樣,請在IB中打開MainWindow.xib,並確保在屬性檢查器中正確設置了根控制器的nib名稱。

爲什麼不能正確設置?一個原因是'重命名'重構不會更新這個,然後內部將不會找到用於連接您的用戶界面的筆尖。或者你自己重新命名了筆尖,並沒有更新這個字段。

1

我剛剛被刺住的一個原因是:如果nib文件由於某種原因未被包含在目標資源文件中(例如,當您將目標添加到項目時沒有選中目標),Xcode不會引發錯誤但是這個筆尖的所有插口都將是空的...

相關問題