2010-01-14 51 views
5

我想我錯過了一些基本的東西,所以我想問一下社區的一些幫助。我正在構建基於基本iPhone實用程序應用程序的應用程序。我的MainView和FlipsideView共享一些元素,所以我爲這些塊創建了單獨的ViewControllers和nib文件。爲了做到這一點,我做了以下幾件事: 1.創建一個名爲searchDateViewController的視圖控制器,它是searchDateView.xib的文件所有者。 2. searchDateView.xib基本上是一個UIView,內部帶有UILabel,視圖連接正確 3.內部都MainViewController.m和FlipsideViewController.m我添加一個子視圖作爲folllows:superview和parentviewcontroller在添加子視圖後爲零

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

一切都顯示和工作得很好。基本上取決於每個主視圖和反面視圖中發生的操作,筆尖的UILabel已更改。但是,如果searchDateViewController是從MainView或FlipsideView加載的,我想做一些稍微不同的事情。但是,我似乎無法找出哪個ViewController添加searchDateViewController子視圖。

在searchDateViewController我想:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

在這兩種情況下,我得到零。

所以我的問題是 - 我可以找出哪個ViewController添加searchDateViewController一個子視圖?如果是這樣如何?或者如果我的邏輯完全搞砸了,我該怎麼做呢?

謝謝!

回答

2

viewDidLoad當視圖控制器加載其視圖被調用。在你的情況,happends在這一行:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

在那一刻,你還沒有叫addSubview:所以也難怪視圖的上海華爲零。

要解決您的問題,您應該在SearchDateViewController中定義一個屬性以區分不同的情況。然後,該屬性將由創建SearchDateViewController實例的父控制器相應地設置。

通常,我不認爲使用UIViewController子類作爲一個視圖的控制器是一個好主意,該視圖用作一個或多個全屏視圖的子視圖,而不是用作全屏視圖本身。大部分UIViewController的邏輯假定它用於管理全屏視圖。例如,在你的設計中,我認爲SearchDateViewController可能會在設備方向改變時修改視圖的框架。由於您不需要全屏子視圖的全部功能,因此我建議您直接從NSObject子類化SearchDateViewController。

+0

好的,謝謝你指出我有關子視圖和UIViewController子類的正確方向。如果我讓SearchDateViewController成爲NSObject的一個子類,那麼這將如何影響我添加子視圖和使用nib啓動的方式?我還沒有找到任何子視圖的例子作爲nsobjects而不是視圖控制器,但我想在這種情況下開始採用任何標準的做法。如果您有任何更多提示,請告知我,謝謝! 此外 - 你們都建議使用父控制器,這是有道理的,但超視角扮演什麼角色?這在這裏會更合適嗎? – deadroxy 2010-01-14 15:49:33

+0

使SearchDateViewController成爲NSObject的一個子類並沒有消除你的問題,它只是避免了未來的問題,因爲UIViewControllers並不真正用於不佔用整個窗口恕我直言的視圖。 要解決您的問題,您的視圖自定義代碼不應該依賴於self.parentViewController或view.superview。相反,在SearchDateViewController中定義一個屬性(可以是BOOL或枚舉),然後查詢它們以決定如何定製視圖。創建SearchDateViewController的對象應該設置屬性。 – 2010-01-14 19:23:02

+0

我這樣做就像你說的在SearchDateViewController類中創建一個屬性,它工作正常。然而,我仍然困惑於如何從UIViewController的子類轉換爲UIView/NSObject。特別是誰成爲​​SearchDateView的文件所有者?我試過每一種方式,我所做的一切都會導致錯誤。 – deadroxy 2010-01-14 20:42:06

-2

ViewController與視圖完全分離。

在大多數情況下,當您向父視圖添加子視圖時,不要將其控制器添加到父視圖的控制器。此規則的例外是導航控制器,它添加了控制器而不是視圖來維護視圖控制器的層次結構。

您的SearchDate viewController無法找到父控制器,因爲您從未分配過一個控制器,系統也不會自動執行此操作。當您從另一個控制器喚起視圖時,您可以分配一個父控制器。

searchDateViewController.parentController=self; 
+0

我的理解是,parentViewController是準備好的,所以我不能設置它(實際上我得到一個錯誤,當我嘗試)。 – deadroxy 2010-01-14 15:53:38

+0

快速跟進 - 我想你可能意味着Ole沒有在SearchDateViewController中創建一個新的屬性來保存這些信息。這很有效,但我仍然對Ole關於這個策略的評論(使用UIViewControllers作爲子視圖)持懷疑態度,通常違背良好的設計原則...... – deadroxy 2010-01-14 15:57:28

+0

你的權利是隻讀的。我只是假設它是讀/寫的,因爲導航控制器設置了屬性。我想知道導航控制器如何設置屬性? Ole是正確的,在同一個可見屏幕上有多個控制器是不好的做法。這個API不太容易支持。 – TechZen 2010-01-14 22:33:06

相關問題