76

ユーザーがナビゲーション バーの「戻る」ボタンをタップしたときに何らかの操作を実行するために、それを検出する必要があります。このように、そのようなボタンに手動でアクションを設定しようとしています:

[self.navigationItem.backBarButtonItem setAction:@selector(performBackNavigation:)];

- (void)performBackNavigation:(id)sender
{
   // Do operations

   [self.navigationController popViewControllerAnimated:NO];
}

最初にそのコードをView Controller自体に配置しましたが、そうであることがわかったself.navigationItem.backBarButtonItemのでnil、同じコードを親View Controllerに移動し、前者をナビゲーションスタックにプッシュしました。しかし、私はそれを機能させることもできません。この問題に関するいくつかの投稿を読みましたが、そのうちのいくつかは、セレクターを親ビューコントローラーに設定する必要があると述べていましたが、とにかく機能しません...何が間違っているのでしょうか?

ありがとう

4

10 に答える 10

131

VIewWillDisappearメソッドを使用して、NavigationItem の [戻る] ボタンが押されたことを検出するこのコードを試してください。

-(void) viewWillDisappear:(BOOL)animated
{
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) 
    {
        // Navigation button was pressed. Do some stuff 
        [self.navigationController popViewControllerAnimated:NO];
    }
    [super viewWillDisappear:animated];
}

または、ナビゲーションの [戻る] ボタンのアクションを取得する別の方法があります。

戻るボタンの UINavigationItem のカスタム ボタンを作成します。

例:

ViewDidLoad で:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleBordered target:self action:@selector(home:)];
    self.navigationItem.leftBarButtonItem=newBackButton;
}

-(void)home:(UIBarButtonItem *)sender 
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}

スウィフト:

override func willMoveToParentViewController(parent: UIViewController?) 
{
    if parent == nil 
    {
        // Back btn Event handler
    }
}
于 2013-09-16T09:12:11.840 に答える
41

迅速

override func didMoveToParentViewController(parent: UIViewController?) {
    if parent == nil {
        //"Back pressed"
    }
}
于 2014-12-16T12:59:37.713 に答える
12

問題はdidMoveToParentViewController、親ビューが再び完全に表示されると呼び出されるため、その前にいくつかのタスクを実行する必要がある場合、機能しません。

また、駆動アニメーション ジェスチャでは機能しません。を使用willMoveToParentViewControllerすると、より効果的です。

Objective-c

- (void)willMoveToParentViewController:(UIViewController *)parent{
    if (parent == NULL) {
        // ...
    }
}

迅速

override func willMoveToParentViewController(parent: UIViewController?) {
    if parent == nil {
        // ...  
    }
}
于 2015-08-06T10:51:56.510 に答える
6

これは、 dadachi のAnswerの Objective-C バージョンです。

Objective-C

- (void)didMoveToParentViewController:(UIViewController *)parent{
    if (parent == NULL) {
        NSLog(@"Back Pressed");
    }
}
于 2015-07-14T16:54:38.593 に答える
3

UINavigationBar のデリゲートを設定し、次を使用します。

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
    //handle the action here
}
于 2014-07-24T06:28:37.403 に答える