[英]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 。
然后擴展您的子類以實現UINavigationBarDelegate的shouldPop方法並在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.