戻るボタンをクリックするとルートビューコントローラーが表示されるように、1つのビュー(異なるビューにあるすべての戻るボタンではない)の戻るボタンをオーバーライドするにはどうすればよいですか。
バックボタンを置き換えて、アクションハンドラーを関連付ける必要があります。
- (void)viewDidLoad {
[super viewDidLoad];
// change the back button to cancel and add an event handler
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@”back”
style:UIBarButtonItemStyleBordered
target:self
action:@selector(handleBack:)];
self.navigationItem.leftBarButtonItem = backButton;
}
- (void)handleBack:(id)sender {
// pop to root view controller
[self.navigationController popToRootViewControllerAnimated:YES];
}
戻るボタンのスタイルも保持する解決策を見つけました。次のメソッドをViewControllerに追加します。
-(void) overrideBack{
UIButton *transparentButton = [[UIButton alloc] init];
[transparentButton setFrame:CGRectMake(0,0, 50, 40)];
[transparentButton setBackgroundColor:[UIColor clearColor]];
[transparentButton addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside];
[self.navigationController.navigationBar addSubview:transparentButton];
}
次に、必要に応じて次の方法で機能を提供します。
-(void)backAction:(UIBarButtonItem *)sender {
//Your functionality
}
戻るボタンを透明なボタンで覆うだけです;)
それは古いですが、正解は次のとおりです。
ViewControllerを他のすべての上にプッシュする代わりに、フルスタックをrootVCと新しいVCのみ)に置き換える方がよいでしょう。
ない:
self.navigationController?.pushViewController(myVc, animated: true)
だが:
let vcStack = self.navigationController?.viewControllers
self.navigationController?.setViewControllers([vcStack![0],myVc], animated: true)
そのように、スタック内の前のviewControllerであるため、背面ではpopToRootになります
私も同様の問題を抱えており、Sarasrangltの回答をうまく利用しました。これがSwiftバージョンです。
override func viewDidLoad() {
let transparentButton = UIButton()
transparentButton.frame = CGRectMake(0, 0, 50, 40)
transparentButton.backgroundColor = UIColor.orangeColor()
transparentButton.addTarget(self, action:"backAction:", forControlEvents:.TouchUpInside)
self.navigationController?.navigationBar.addSubview(transparentButton)
}
そして機能は
func backAction(sender:UIButton) {
// Some sction
}
別のアプローチは、 INavigationControllerDelegate プロトコルを採用することです。
– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:
これらのメソッドは、コントローラーが表示されたときに通知しますが、コントローラーが目的のコントローラーであることを確認する必要があります。
Objective CでのSarasrangltの透明なボタンの方法と、PavleMijatovicの以前のSwiftバージョン、ここにSwift 4バージョン:
let transparentButton = UIButton()
transparentButton.frame = CGRect(x:0, y:0, width:50, height: 40)
transparentButton.backgroundColor = UIColor.clear
transparentButton.addTarget(self, action:#selector(backAction(sender:)), for:.touchUpInside)
self.navigationController?.navigationBar.addSubview(transparentButton)
そして
@objc func backAction(sender:UIButton) {
// Some action
}
同じ外観を維持するために使用できます:
UIView *leftButtonView = [[UIView alloc]initWithFrame:CGRectMake(-12, 0, 105, 30)];
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
leftButton.frame = leftButtonView.frame;
[leftButton setImage:[UIImage imageNamed:@"ic_system_back"] forState:UIControlStateNormal];
[leftButton setTitle:@"title" forState:UIControlStateNormal];
[leftButton.titleLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[leftButton.titleLabel setFont:[UIFont systemFontOfSize:16]];
[leftButton setTitleEdgeInsets: UIEdgeInsetsMake(0, 8, 0, 0)];
[leftButton addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
[leftButtonView addSubview:leftButton];
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc]initWithCustomView:leftButtonView];
self.navigationItem.leftBarButtonItem = leftBarButton;