2012-06-16 43 views
1

我看到一個與子視圖方法調用相關的奇怪問題,該調用顯示爲iOS版本特定的。切換視圖時的iOS特定行爲

我有兩個可交換的視圖與父視圖控制器比確定哪一個將顯示。基本上有一個登錄視圖,當你登錄時會被換出到一個賬戶視圖,當你註銷時可以退出登錄。

代碼非常簡單。下面是在您登錄時被調用父​​視圖控制器的樣品的方法:

- (void) showAccountView:(BOOL)animated 
{ 
    if(self.accountController == nil) 
     self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 

    [self.loginController viewWillDisappear:animated]; 
    [self.accountController viewWillAppear:animated]; 

    [self.loginController.view removeFromSuperview]; 
    [self.view insertSubview:alertsController.view atIndex:0]; 

    [self.loginController viewDidDisappear:animated]; 
    [self.accountController viewDidAppear:animated]; 
} 

還有另外一個就這樣用於顯示登錄視圖。非常簡單。我遇到的問題是viewWillAppear,viewDidAppear,viewWillDisappear,viewDidDisappear方法都在iOS 4.3下調用一次,但在iOS 5.0和5.1下調用兩次。

例如,在所有iOS版本中,子視圖的viewWillAppear在父視圖直接調用它時(當然)被調用。但是,只有iOS 5.0和5.1纔會在調用insertSubview期間再次調用它。

所以,如果我除了呼籲removeFromSuperview和insertSubview刪除一切,所以它看起來像這樣:

- (void) showAccountView:(BOOL)animated 
{ 
    if(self.accountController == nil) 
     self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 

    [self.loginController.view removeFromSuperview]; 
    [self.view insertSubview:alertsController.view atIndex:0]; 
} 

現在5.0和5.1下的子視圖的方法只得到insertSubview期間調用一次每個。但是,它會導致4.3之下的問題,因爲它們根本不會被調用。

我讀過幾篇有關確保子視圖方法被調用的帖子,但我還沒有看到任何與iOS相關的行爲。

此外,我認爲可以做這項工作的唯一方法是在運行時檢查iOS版本,並直接調用iOS 4.3的子視圖方法,而不是在5.0和5.1下調用它們。

任何想法?

+1

首先,你永遠不應該調用'viewWill/Did' ......其次,你怎麼知道他們沒有被調用? – CodaFi

+0

我同意你的看法,我不應該打電話給他們,但顯然我是這麼做的,因爲他們在4.3中沒有自己打電話。我可以告訴他們沒有被調用,因爲我設置的斷點沒有被擊中。另外,從視圖的功能來看,它們顯然沒有被調用。其實,我只是發現[這篇文章](http://stackoverflow.com/questions/7890374/viewwillappear-not-getting-called-with-uisplitviewcontroller),討論類似的問題,我看到的答案。他們似乎認爲這是iOS中的一個錯誤,並建議使用動態版本檢查。 – d512

回答

0

你不應該在另一個視圖控制器中擁有一個視圖控制器的內容,除了在iOS 5中添加了新的父/子視圖控制器支持之外。現在官方支持使用一些新方法(例如addChildViewController, transitionFromViewController:toViewController:duration:options:animations:completion)

如果你確實嘗試在iOS 4或更低版本的iOS 4或更早版本中託管一個視圖控制器的視圖,那麼你每個步驟都要與操作系統對抗。

+0

我從iOS開發書中獲得了這種技術,並不是說它正確。那麼以什麼樣的方式來實現我在5.0之前的iOS版本中所做的工作呢? – d512

+0

@Duncan C我明白在某些ViewController上有限制,例如一個UISplitViewController必須是根。但是,將UITableViewController放在UISplitViewController中是很常見的。請你能澄清你的觀點,或者指出支持它的文檔?謝謝。 – Snips

+0

@strips,我的意思是,在iOS 5之前,你不應該把你的自定義視圖控制器的內容放在另一個內。 Apple的容器視圖控制器(導航控制器,標籤欄控制器和iPad,分體視圖控制器)是特殊的,並且設計爲包含其他視圖控制器。 內置於iOS 5中的父/子視圖控制器方案允許您創建自己的具有不同行爲的容器視圖控制器。 我做了一些挖掘,並找不到文檔中的聲明,你應該沒有一個視圖控制器的視圖內花葯預iOS 5,但我已經看到它。 –