2011-01-07 202 views
5

在我的應用程序中,我有一個基本的導航控制器。對於我的所有觀點,除了一個以外,控制器都按照它應該的那樣工作。iPhone:如何覆蓋導航控制器中的後退按鈕?

然而,特別是一個視圖,我想的「返回」按鈕,不會再回到以前的觀點,但去一個我設置。特別是它將返回2個視圖並跳過一個視圖。

- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
//i set a flag to know that the back button was pressed 
if (viewPushed) { 
    viewPushed = NO; 
} else { 
    // Here, you know that back button was pressed 
    mainMenu *mainViewController = [[mainMenu alloc] initWithNibName:@"mainMenu" bundle:nil]; 
    [self.navigationController pushViewController:mainViewController animated:YES]; 
    [mainViewController release]; 
} 

}

做一些研究,我發現,我可以攔截的看法,當它消失了,所以我試圖把在代碼中有它瀏覽網頁,我想以後這沒有用,所以有人有任何想法?

謝謝!

回答

12

在代碼中,你似乎在試圖另一個視圖控制器壓入堆棧,而不是彈出一個附加項目,關閉它。

試試這個作爲你的代碼,不會的可以追溯到兩個層次:

NSArray *vcs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[vcs objectAtIndex:[vcs count]-3]; 

另外,您可以完全取代後退按鈕用自己的按鈕?在你的viewController:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(doSomething:)]; 

self.navigationItem.hidesBackButton = YES; 
self.navigationItem.leftBarButtonItem = item; 
[item release]; 

然後,你可以寫DoSomething的:方法彈出兩個項目從堆棧中,可能使用我上面貼的代碼。

+0

到目前爲止,這非常棒!感謝您的答覆!!我能夠創建自定義按鈕,創建方法,並使用打開的視圖列表構建數組。然而,當我跨越popToViewController行時,我得到'未捕獲的異常'錯誤...我甚至試過這個:[self.navigationController popToViewController:[vcs objectAtIndex:1]];無濟於事。我現在正在研究有關popToViewController的更多信息。 – 2011-01-07 22:13:32

+0

我結束了使用:[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];回到兩個層面..迄今爲止工作很好,所以謝謝你! – 2011-01-07 22:29:15

2

您可以嘗試實現UINavigationBarDelegate委託。當方法-navigationBar:didPopItem:被調用時,你可以彈出從UINavigationController額外的項目,因此在一次彈出兩個項目。

+0

這也是或多或少地例如重寫的UINavigationController popViewControllerAnimated方法的方式向後確認導航。這樣,您必須實現的區別 - (BOOL)的導航欄(UINavigationBar的*)的導航欄shouldPopItem:(UINavigationItem *)UINavigationBarDelegate的項目方法。 – 2011-01-14 11:47:01

3

簡單的解決方案:

- (void)viewWillDisappear:(BOOL)animated { 
    //if true, back was pressed 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
      //your logic 
    } 
} 
-1
UIButton *home = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *homeImage = [UIImage imageNamed:@"back.png"]; 
[home setBackgroundImage:homeImage forState:UIControlStateNormal]; 
[home addTarget:self action:@selector(LogOut) 
forControlEvents:UIControlEventTouchUpInside]; 
home.frame = CGRectMake(0, 0, 69, 26); 
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:home]; 
[[self navigationItem] setLeftBarButtonItem:button2]; 
[button2 release]; 
button2 = nil; 
相關問題