我看到一個與子視圖方法調用相關的奇怪問題,該調用顯示爲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下調用它們。
任何想法?
首先,你永遠不應該調用'viewWill/Did' ......其次,你怎麼知道他們沒有被調用? – CodaFi
我同意你的看法,我不應該打電話給他們,但顯然我是這麼做的,因爲他們在4.3中沒有自己打電話。我可以告訴他們沒有被調用,因爲我設置的斷點沒有被擊中。另外,從視圖的功能來看,它們顯然沒有被調用。其實,我只是發現[這篇文章](http://stackoverflow.com/questions/7890374/viewwillappear-not-getting-called-with-uisplitviewcontroller),討論類似的問題,我看到的答案。他們似乎認爲這是iOS中的一個錯誤,並建議使用動態版本檢查。 – d512