簡體   English   中英

iPhone-更改UINavigationController上“后退”按鈕的目標或選擇器

[英]iPhone - Change target or selector for Back Button on UINavigationController

在UINavigationController上按下UIViewController時,默認行為是使OS顯示一個后退按鈕,該按鈕會再次彈出UIViewController。

我希望為此后退按鈕設置不同的行為(返回兩個屏幕)-無論如何,我都可以執行此操作而不必使用自定義圖形等創建自己的后退按鈕。

謝謝 :)

正如我最初懷疑的那樣,這是不可能的任何特別簡單的方法。 因此,在創建任何自定義UIBarButtonItem時應用相同的方法,只需從Google采購后退按鈕圖標即可。...

UIButton *backButtonInternal = [[UIButton alloc] initWithFrame:CGRectMake(0,0,54,30)];
[backButtonInternal setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];
boldSystemFontOfSize:12]];
[backButtonInternal addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonInternal];   
[backButtonInternal release];
[[self navigationItem] setLeftBarButtonItem:backBarButton];
[backBarButton release];

使用“ leftBarButtonItem”可以設置目標和選擇器。 但是,如果您在前一個控制器上設置了“ backBarButtonItem”,則目標和選擇器將被忽略。 但是,leftBarButtonItem沒有向左的箭頭。

如果將導航控制器子類化,則可以實現popViewControllerAnimated:方法,並拋出isKindOfClass:在那里檢查以確定是否正在彈出您要查找的視圖控制器。 例如:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    //Reference current controller being displayed
    UIViewController *currentController = [self.viewControllers lastObject];

    //Check class
    if ([currentController isKindOfClass:[MyDesiredController class]]) {
        NSLog(@"Popping Desired Controller, Do Stuff Here");
    }

    return [super popViewControllerAnimated:animated];
}

但是,這並不會取消視圖控制器的實際彈出操作(返回nil會阻止該控制器彈出,但仍會導致導航欄彈出其信息,並且向導航欄的ShouldPop:委托方法返回NO仍會彈出該視圖控制器我聽說這僅在使用導航控制器時發生,但我尚未對此進行測試)。

但是,根據您的情況,由於您希望向后彈出兩個視圖控制器,因此您可以通過將視圖控制器轉換為nsmutablearray,刪除控制器,然后將該nsmutablearray轉換回一個導航控制器的viewcontrollers屬性中刪除倒數第二個視圖控制器。數組,並將其設置為導航控制器的viewcontrollers屬性。 我尚未對此進行測試,但我想我會分享這個想法。

UIViewController的navigationItem屬性有問題嗎? 例如,這是我獲得取消按鈕的方法:

self.navigationItem.leftBarButtonItem =
  [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
                                               target: self
                                               action: @selector(cancel)] autorelease];  

在父母的視圖控制器中,

- (void)viewDidLoad
{    
    self.navigationController.delegate= self;
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self)
    {
        // your codes
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM