web-dev-qa-db-ja.com

デフォルトの戻るボタンの外観を維持しながら、ナビゲーションスタックの戻るボタンを上書きしますか?

戻るボタンをクリックするとルートビューコントローラーが表示されるように、1つのビュー(異なるビューにあるすべての戻るボタンではない)の戻るボタンをオーバーライドするにはどうすればよいですか。

16
Pintu

バックボタンを置き換えて、アクションハンドラーを関連付ける必要があります。

- (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];
}
32
Mike Bretz

戻るボタンのスタイルも保持する解決策を見つけました。次のメソッドを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
}

戻るボタンを透明なボタンで覆うだけです;)

13
Sarasranglt

それは古いですが、正解は次のとおりです。

ViewControllerを他のすべての上にプッシュする代わりに、フルスタックをrootVCと新しいVCのみ)に置き換える方がよいでしょう。

ない:

self.navigationController?.pushViewController(myVc, animated: true)

だが:

let vcStack = self.navigationController?.viewControllers
self.navigationController?.setViewControllers([vcStack![0],myVc], animated: true)

そのように、スタック内の前のviewControllerであるため、背面ではpopToRootになります

6
valR

私も同様の問題を抱えており、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
 }
6
Pavle Mijatovic

別のアプローチは、 INavigationControllerDelegate プロトコルを採用することです。

– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:

これらのメソッドは、コントローラーが表示されたときに通知しますが、コントローラーが目的のコントローラーであることを確認する必要があります。

2
nacho4d

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
}
0
auspicious99

同じ外観を維持するために使用できます:

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;
0
Johan Collu