簡體   English   中英

如何在 UINavigationController 的 RootViewController 上顯示后退按鈕?

[英]How to show back button on the RootViewController of the UINavigationController?

這是我的代碼。 我想在打開的 rootviewController 上放一個后退按鈕。

- (void)selectSurah:(id)sender {

    SurahTableViewController * surahTableViewController = [[SurahTableViewController alloc] initWithNibName:@"SurahTableViewController" bundle:nil];
    surahTableViewController.navigationItem.title=@"Surah";

    surahTableViewController.navigationItem.backBarButtonItem.title=@"Back";

    UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:surahTableViewController];

    [self presentModalViewController:aNavigationController animated:YES];   
}

我不相信可以將根視圖控制器從導航堆棧中彈出,但您可以使用添加的UIButton偽造它作為UIBarButtonItem的自定義視圖:

UIButton *b = [[UIButton alloc]initWithButtonType:UIButtonTypeCustom];
[b setImage:[UIImage imageNamed:@"BackImage.png"] forState:UIControlStateNormal];
[b addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
self.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:b];

可以在此處找到適合的iOS UI元素的PSD。

Faizan,

Helium3評論很有​​意義。

我想你的按鈕需要以模態方式解除控制器,這是真的嗎? 如果我錯了,請糾正。

如果是這樣,您可以創建一個新的UIBarButtonItem並設置為UINavigationController navigationItem的左(或右)按鈕。 SurahTableViewController破壞封裝,請在SurahTableViewController控制器的viewDidLoad方法中創建它。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // make attention to memory leak if you don't use ARC!!!
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
           style:UIBarButtonItemStyleBordered
             target:self
             action:@selector(close:)];
}

-(void)close:(id)sender
{
    // to dismiss use dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
    // dismissModalViewControllerAnimated: is deprecated

    [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"controller dismissed"); }];
}

由於SurahTableViewController是導航控制器中的根視圖控制器,因此您無法返回到根目錄,因為您已經在那里。 由於您已經從其他方式以模態方式呈現它,因此您需要在導航欄上放置一個按鈕,該按鈕具有調用的IBAction

[self dismissModalViewControllerAnimated:YES];

UINavigationController中后退按鈕的外觀和行為依賴於UINavigationControllers堆棧之間的交互。 在第一個控制器上放置一個后退按鈕違反了這個約定,沒有什么可以回到,這就是你的代碼無法正常工作的原因。

您需要手動將UIBarButtonItem添加到標題欄代碼中,如:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];

如果您真的希望它看起來像后退按鈕,則需要手動創建帶有鏡像后退按鈕的圖像的UIBarButtonItem。

但是另一個建議是,因為看起來你正試圖使用​​后退按鈕來關閉一個模態視圖控制器,我會堅持使用像“關閉”或“完成”按鈕這樣更常規的東西來關閉模態視圖控制器。 后退按鈕更適合導航一堆UINavigationControllers。

這是我認為每個人都在尋找的答案。

只需在自定義初始值設定項中提供一個空的UIViewController作為UINavigationController子類的rootViewController 即可 然后在呈現之前推送您的實際rootViewController沒有動畫:

init(backButtonRootViewController: UIViewController) {
    super.init(rootViewController: UIViewController())
    
    interactivePopGestureRecognizer?.isEnabled = false
    pushViewController(backButtonRootViewController, animated: false)
}

您還需要禁用InteractivePopGestureRecognizer以防止用戶回空的rootViewController

然后擴展您的子類以實現UINavigationBarDelegateshouldPop方法並在rootViewController上按下后退按鈕時關閉導航控制器:

func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
    
    if children.count >= 2 && children[1] == topViewController {
        presentingViewController?.dismiss(animated: true, completion: nil)
        return false
    } else {
        return true
    }
}

奇跡般有效!

對於 Swift,請嘗試以下操作:

override func viewDidLoad() {
    super.viewDidLoad();
    self.navigationItem.hidesBackButton = true;
    let backButton = UIBarButtonItem(
        image: UIImage(named: "my_back_asset"), style: .plain,
        target: self, action: #selector(self.onBack));
    self.navigationItem.leftBarButtonItem = backButton;
}

@objc private func onBack() {
    let controller = self.navigationController?.popViewController(animated: true);
    if controller == nil {
        // Handle pressing back when on root here.
    }
}

請注意將“ my_back_asset ”更改為您自己的后退按鈕圖像。

暫無
暫無

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

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