0

我有一個UINavigationController和3個簡單控制器鏈。每個人都有一個按鈕。當按下一個按鈕時,下一個控制器被按下。 ViewController1 - > ViewController2 - > ViewController3。當我在第三個視圖上按下後退按鈕時,我想要移至第一個視圖。 backBarButtonItem的使用是強制性的。這裏是第二個控制器代碼:彈出控制器後按下回車鍵按鈕

#import "ViewController2.h" 

static BOOL isBackButtonPressed; 

@implementation ViewController2 

- (void)viewDidLoad { 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:nil action:nil]; 
    [super viewDidLoad]; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    if (isBackButtonPressed) { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } else { 
     isBackButtonPressed = YES; 
    } 
    [super viewWillAppear:animated]; 
} 

@end 

但是當我按後退按鈕在第三視圖我回到第二視圖,而不是第一個視圖。你能幫我回到第三個視圖的第一個視圖按下按鈕嗎? 我嘗試了答案的建議,但他們沒有幫助。

  1. 添加一個選擇器到backBarButtonItem沒有幫助,因爲它永遠不會被調用。
  2. 在viewWillDisappear方法中添加[self.navigationController popToRootViewControllerAnimated:YES]也不起作用。我不知道爲什麼。我認爲實際的問題是backBarButtonItem是如何工作的。 還有其他建議嗎?

我嘗試實現的行爲存在於iPhone上的日曆中。當您將iPhone旋轉到橫向時,您可以進入weeek視圖。然後轉到活動詳情,然後旋轉到肖像。當您按下返回按鈕時,您將進入一個日視圖而不是一個星期視圖,因此帶有周視圖的控制器將被跳過。

+0

只是在代碼中出現問題時,您會忘記調用'supper',如[super viewDidLoad]和'[super viewDidLoad:animated]'。 – rckoenes

+0

我編輯了我的代碼,但這對行爲無關緊要。 – PSsam

回答

0

經過無數次嘗試我的解決方案是根本不使用backBarButtonItem!因爲無論我做什麼,它總是前往viewController而不是調用它的選擇器

相反,我只使用leftBarButtonItem進行導航,因爲它保證調用我的動作。

下面的例子

UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 27, 22)]; 
[backButton setImage:[UIImage imageNamed:@"backbutton"] forState:UIControlStateNormal]; 
    [backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

這當然要求backButtonPressed行動..這適用於IOS 6和7

+0

謝謝你的回覆。這個問題已經過去了一段時間,我不記得細節,但由於某些原因,我想使用一個後退按鈕。我不會檢查你的解決方案,但我相信它會起作用。 – PSsam

+0

沒問題,因爲我已經嘗試了很多小時尋找這個解決方案,我認爲它應該在這裏爲其他有類似問題的人 – Gorkem

0

我有同樣的問題,因爲你beofre和固定它是這樣的:

您可以捕獲在ViewController3和坡平視圖之前返回按鈕,從導航堆棧這樣的刪除ViewController2:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:self action:@selector(customBackPressed:)]; 
} 

-(void)customBackPressed:(id)sender { 
     NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers]; 
     for (UIViewController *vc in viewControllers) 
     { 
     // If vc is ViewController2 type, remove it 
     } 

     navigationController.viewControllers = allViewControllers; 

     [self.navigationController popViewControllerAnimated:YES]; 
} 

由於ViewController2不在堆棧中,它將跳轉到ViewController1。

而且,如果ViewController1是根視圖控制器,你可以這樣做:

[self.navigationController popToRootViewControllerAnimated:YES]; 
+0

當擁有多於三個級別時,這將變得非常複雜,view 1也是rootviewcontroller,爲什麼不只是彈出到rootviewcontroller。 – rckoenes

+0

Thanx爲您的答覆。也許我做錯了什麼,但是當我使用你的代碼選擇器沒有被調用。 – PSsam

+0

嘗試self.navigationItem.leftBarButtonItem代替 –

0

無需註冊後退按鈕一個新的選擇,只是做:

-(void)viewWillDisappear{ 
    if ([self.navigationController.viewControllers containsObject:self]) 
     //It means that the view controller was popped (back button pressed or whatever) 
     //so we'll just pop one more view controller 
     [self.navigationController popViewControllerAnimated:NO]; 
} 

ViewController3viewWillDisappear方法

0

嘗試在你的第三個視圖控制器中使用這個,這樣你檢查你是否按下了後退按鈕並直接彈出到如你所說的根視圖控制器是你的第一個視圖控制器。

-(void) viewWillDisappear:(BOOL)animated { 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
    } 
    [super viewWillDisappear:animated]; 
} 
+0

我試過這個,但是這段代碼不會影響行爲。 – PSsam