2010-05-03 182 views
0

我正在創建一個基於Utility模板的應用程序。主屏幕由一個帶有幾個按鈕的菜單組成,每個按鈕創建一個不同的翻轉視圖。在其中一個翻轉視圖中,我還配置了一個導航控制器,只要我激活了NavigationBar,它就可以完美工作......我可以推動視圖,但必須使用「後退」按鈕返回到我的翻轉屏幕,側視圖,這將是導航控制器的根。如果我嘗試返回使用「popViewControllerAnimated」,正確配置按鈕,而不是NavigationBar的「後退」按鈕,問題就出現了。我的應用程序因某種原因崩潰,我無法理解爲什麼。popViewControllerAnimated不能正常工作,但後退按鈕能正常工作

我可以使用NavigationBar中的「後退」按鈕並忘記問題,但我更願意擁有自己的按鈕以便返回。

我的應用程序包括以下內容:

我APPDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    MenuViewController *menuController = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:nil]; 
    self.menuViewController = menuController; 
    [menuController release]; 

    menuViewController.view.frame = [UIScreen mainScreen].applicationFrame; 
    [window addSubview:[menuViewController view]]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

MenuViewController.m開始我的翻蓋側視圖:

- (IBAction)showFuelUpliftView {  

    FuelUpliftViewController *controller = [[FuelUpliftViewController alloc] 
              initWithNibName:@"FuelUpliftView" bundle:nil]; 
    controller.delegate = self; 
    controller.title = @"Fuel Uplift"; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 
    [navController setNavigationBarHidden: NO]; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:navController animated:YES]; 

    [navController release]; 
    [controller release]; 
} 

FuelUpliftViewController.m,我在那裏用按鈕推動NavigationController的第二個視圖:

- (IBAction)showFuelUplift2View:(id)sender { 
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 
    controller.title = @"Settings"; 
    [self.navigationController pushViewController:controller animated:YES]; 
    [controller release]; 
} 

最後,我FuelUplift2ViewController.m,在試圖返回時,應用程序崩潰:

- (IBAction)backFromFuelUplift2View { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

我不知道這一切是有道理的,我目前正在與我的第一個應用開始,現在還在學習感謝傳統的試用錯誤方法。不過,我看不出這個問題的原因,並希望得到任何幫助。

非常感謝,

馬努

+1

調試內存問題我發現下面的文章非常有用:http://www.cocoadev.com/index.pl?DebuggingAutorelease特別是我建議你設置NSZombieEnabled和MallocStackLogging環境變量,並檢查究竟是什麼失敗。 – SergGr 2010-05-03 13:09:35

+0

我會嘗試一下,看看會發生什麼,感謝您的建議! – Manu 2010-05-03 17:26:04

回答

1

我終於能夠解決我的問題。

爲了創造在我的UINavigationController第二種觀點,我有這樣的:

- (IBAction)showFuelUplift2View:(id)sender { 
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 
    controller.title = @"Settings"; 
    [self.navigationController pushViewController:controller animated:YES]; 
    [controller release]; 
} 

我把這些代碼從另一個論壇,它的工作馬上,所以我無法想象,我要有問題。通過上面的代碼,如果我理解正確,我爲我的第二個視圖創建一個新的UIViewController,這就是爲什麼我能夠切換到第二個視圖並有一個工作的「後退」按鈕。

總之,爲了配置自己的按鈕返回,我應該寫如下:

FuelUplift2ViewController *controller = [[FuelUplift2ViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 

顯然我不能正確初始化一個隨機的UIViewController,但我並沒有指明正確的哪一個是(FuelUplift2ViewController),我的方法返回到第一個視圖無法正常工作。

這可能是一個非常基本的問題,但花了我幾個小時才明白這個問題,我很高興能夠自己找到它,緊跟着我的代碼並使用一點常識。

0

當問崩潰,它是顯示你得到的消息,一個非常好的主意。

您顯示的代碼中沒有任何明顯的錯誤,雖然「self.delegate」行讓我感到可疑。你應該檢查財產是如何聲明的,如果你是雙重釋放它。

+0

非常感謝您的回覆! 我絕對需要檢查該代表;我的應用程序基於Xcode中包含的實用程序,因此我使用相同的結構,並且沒有更改任何與代表有關的內容。無論如何,它必須與它有關,因爲當不使用委託時,我可以使其他應用程序與popViewControllerAnimated協同工作。 我得到的消息是: ***終止應用程序由於未捕獲的異常zNSInvalidArgumentException',原因:'*** - [UIViewController backFromFuelUplift2View]:無法識別的選擇器發送到實例0x3917440' – Manu 2010-05-03 17:22:51

+0

我對這一切有個疑問:爲什麼如果我按下導航欄中的「返回」按鈕,但是如果我使用popViewControllerAnimated創建了我自己的方法,它會如何工作?他們不應該完全一樣嗎? – Manu 2010-05-03 17:35:04

+0

錯誤消息告訴你所有。您正在將錯誤消息發送給錯誤的對象。 – 2010-05-03 19:36:41