2010-07-11 88 views
0

我有3個視圖。presentModalViewController無法正常工作

我要做到以下幾點:

A presents B modally 
A dismisses B 
A presents C modally 

我已經建立了委託模式,其中A是B的代表。這是怎麼了呈現,在b駁回:

[delegate dismissB]; //this is just [self dismissModalViewControllerAnimated:NO] 
[delegate presentC]; //this is just [self presentModalViewController:c animated:NO]; 

出於某種原因,我的應用程序崩潰時我沒有調試結果(我已經NSZombieEnabled)執行該代碼。

當我評論出[delegate presentC]該應用程序將正確解僱B. 當我註釋掉[delegate dismissB]時,應用程序不執行任何操作,即使該行執行。我不知道爲什麼?

UPDATE: 這裏是一個

-(void)showARView{ 
    [self dismissModalViewControllerAnimated:NO]; 

    ARViewController* arViewController = [[[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil]autorelease]; 
    UINavigationController *arNavController = [[UINavigationController alloc] initWithRootViewController:arViewController]; 

    LeaderBoardTableViewController* lbViewController = [[[LeaderBoardTableViewController alloc] initWithNibName:@"LeaderBoardTableViewController" bundle:nil]autorelease]; 
    lbViewController.title = @"Leaderboard";  
    UINavigationController *lbNavController = [[UINavigationController alloc] initWithRootViewController:lbViewController]; 

    arTabBarController = [[UITabBarController alloc] init];//initWithNibName:nil bundle:nil]; 
    arTabBarController.delegate = self; 
    arTabBarController.viewControllers = [NSArray arrayWithObjects:arNavController, lbNavController, nil]; 
    arTabBarController.selectedViewController = arNavController; 

    [arNavController release]; 
    [lbNavController release]; 

    [self presentModalViewController:arTabBarController animated:NO]; 
} 

代碼在這裏在B

[delegate showARView]; 
+0

嗨希恩你能解決這個問題嗎,我也面臨同樣的問題。如果你分享解決方案 – 2012-06-18 15:53:50

回答

0

代碼當調用dismissB委託駁回視圖 - 控制。在正常情況下(如果您不保留其他地方),這會導致視圖控制器同步處理。之後,您正在嘗試訪問委託實例變量,但爲此,代碼需要一個理智的(隱藏的)自指針,這個指針被處理。我不確定NSZombie能否在這種情況下提供幫助。通過在[delegate dismissB];之前插入[[self retain] autorelease];,您可以輕鬆找出是否這是您的崩潰原因。然而這是一個破解而不是修復。你有一個設計問題。

這不是代表意欲使用的方式。 B呈現一些用戶界面並接收一些用戶交互。然後它應該告訴A通過委託消息發生了什麼,例如, bWasCanceled或bFinished。在你的情況A中,代表有責任決定下一步該做什麼。所以你的情況的代表可決定撤消B和代替目前C或代碼:

// Inside A 
- (void)controllerB:(UIViewController*)ctl didFinishWithResult:(id)something { 
    [self dismissModalViewControllerAnimated:NO]; 
    // Instantiate and initialize c 
    [self presentModalViewController:c animated:NO]; 
} 

// Inside B 
[delegate controllerB:self didFinishWithResult:@"OK"]; 

如果我完全曲解了你的代碼,一切都很好,我有一個其他建議。當在同一輪循環中解散和呈現模態視圖控制器時,我看到了一些奇怪的問題。您可以嘗試[delegate performSelector:@selector(presentC) withObject:nil afterDelay:0.0];,看看是否有幫助。

+0

感謝您的詳細解釋。我在這篇文章中更新了我的代碼,但仍得到相同的結果。即使是駭人聽聞的留言也沒有用。思考? – 2010-07-13 09:17:21