2013-05-16 48 views
3

我是iOS開發新手,我有一個理解文件所有者邏輯的問題。作爲子視圖文件所有者的iOS?

我有這樣的情況:

我有兩個觀點(View_iPad,View_iPhone)及其控制器(ViewController_iPad,ViewController_iPhone)。基於啓動應用程序的設備,將使用特定視圖及其控制器。然後,我將xib文件的子視圖添加到此視圖中(使用iPad或iPhone視圖無關緊要)。假設這個子視圖在iPad和iPhone視圖中有不同的位置。這個子視圖包含一些標籤,所以我必須在子視圖控制器中創建IBOulets。

如果我明白,根據蘋果的邏輯,文件所有者的視圖是一個控制器(有權訪問該視圖並可以與之通信的文件)。所以3個視圖(iPhone,iPad,子視圖)中的每一個都有自己的控制器,這意味着這些控制器是這些視圖的文件所有者。

但是當我加載子視圖與代碼:

 NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil]; 

並將其添加爲一個子視圖到iPad/iPhone的看法,有一個問題,因爲這個子視圖包含標籤IBOutlets和這個標籤的子視圖控制器不在iPhone/iPad控制器中。

顯示此錯誤,則:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0x7ab4> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'

我該如何解決這個問題?我試圖把所有者@「subviewController」,但它沒有幫助。謝謝。

編輯!!: 所以我試圖解決這個問題,但它仍然沒有工作。這是一個新的情況:

子視圖控制器是子視圖的所有者,但根視圖的自定義類是一個包含插座的類(從UIView派生)。

如果我在iPad/iPhone的控制器所有者:@ 「subviewController」,IGOT這個錯誤:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSObject 0x715bf30> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'

凡的觀點是從子視圖控制器的屬性。現在告訴我問題在哪裏。我真的很絕望!

或者如果我擁有owner:self,則帶有指令的某個窗口將以EXC_BAD_ACCESS錯誤打開。

+0

有兩個問題:1)在哪個類中執行了'NSArray * nibContents ='行(即self的值是多少)以及2)在哪裏觸發了異常?爲了找出在'throw'上設置一個異常斷點。 – NSSplendid

+0

1)取決於應用程序啓動的設備。 Self是ViewController_iPad或ViewController_iPhone。 2)在loadNibNamed行中觸發異常。 – DanielH

回答

2

Xcode的Interface Builder類部分中的文件所有者圖標(因爲IB不再單獨存在)是在加載nib時指定爲所有者的對象的代理。通常,這是加載筆尖的對象,通常是應用程序或視圖控制器。

當你說:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil]; 

那麼文件的所有者將任何物體self是線之上。如果您希望除包含上面這行的那個對象之外的對象成爲所有者,請在owner:參數中指定該對象。

+0

好吧,loadNibNamed的代碼在iPhone/iPad控制器中。如果擁有者設置爲self,則表示擁有者是iPhone/iPad控制器。但是在這個控制器中,子視圖中沒有用於標籤的IBOutlets。正如我寫的,我試圖將owner設置爲subviewController而不是self,但它沒有幫助。而且我不能將IBOulets放入iPhone/iPad控制器,因爲那樣我就無法將標籤綁定到位於不同文件中的IBOutlet。 – DanielH

+0

查看nib文件中的文件所有者。檢查員中的文件所有者的類型是什麼?您需要確保在加載筆尖時指定爲所有者的對象是同一類型的對象。此外,無論您指定爲文件的所有者類型的類都需要具有「視圖」屬性,還是與鍵「視圖」兼容的KVC。這正是錯誤告訴你的:所有者對於名爲'view'的密鑰不符合KVC標準。 – Caleb

3

所以首先,如果你有一個從xib/storyboard創建的視圖控制器,然後視圖控制器owns他的看法。如果您使用xib文件創建自定義視圖,那麼文件所有者將是自定義類(UIView的一個子類),但是當您使用xib文件創建自定義視圖時,必須將IBOutlest鏈接到UIView而不是像您那樣的文件所有者當你有一個視圖控制器時正在做。第二,你的問題不是由owner產生的,你的問題si是由錯誤鏈接的插座產生的,可能你將視圖鏈接到了一個字符串的插座,所以請檢查你所有的插座和它們的相應視圖。

+0

1)><您必須將IBOutlest鏈接到UIView而不是文件所有者>要將UIView綁定到網點?文件所有者在這種情況下是subviewController,它包含插座,我只是將它們綁定到IB – DanielH

+0

2)><您將視圖鏈接到插口是一個字符串> - 我不明白你的意思是一個字符串。我知道這是一個愚蠢的問題,但我是一個新手,仍然不明白這個問題。 – DanielH

相關問題