Как вызвать метод, когда нажата кнопка «Назад» на UINavigationController? (IPhone) - PullRequest
13 голосов
/ 23 января 2012

Как я могу вызвать метод, когда нажата кнопка возврата на UINavigationController.Мне нужно иметь возможность вызывать метод перед отображением предыдущего представления.Это возможно?Если да, то может кто-нибудь посоветовать, как это сделать?

Ответы [ 4 ]

15 голосов
/ 23 января 2012

Быстрое решение - добавить реализацию для метода viewWillDisappear: .Он сработает, как только viewController исчезнет в ответ на нажатие кнопки «назад».

- (void)viewWillDisappear:(BOOL)animated {
  //... 
  //make you stuff here
  //... 
}

Другое решение - добавить пользовательский ответчик для кнопки «Назад».Вы можете изменить метод init вашего viewController следующим образом:

- (id)init {
    if (self = [super init]) {
        //other your stuff goes here
        //... 
        //here we customize the target and action for the backBarButtonItem
        //every navigationController has one of this item automatically configured to pop back
        self.navigationItem.backBarButtonItem.target = self;
        self.navigationItem.backBarButtonItem.action = @selector(backButtonDidPressed:);
    }
    return self;
}

, а затем вы можете использовать метод селектора следующим образом.Обязательно корректно отключите viewController, иначе ваш навигационный контроллер не выскочит так, как хотелось бы.

- (void)backButtonDidPressed:(id)aResponder {
    //do your stuff
    //but don't forget to dismiss the viewcontroller
    [self.navigationController popViewControllerAnimated:TRUE];
}
6 голосов
/ 03 января 2014

Мне кажется, я нашел «чистый» способ сделать это:

Сначала установите контроллер представления как соответствующий протоколу UINavigationControllerDelegate

@interface MyViewController () <UINavigationControllerDelegate>

Затем определите его как делегат

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // Set this View Controller as the navigation controller delegate
    self.navigationController.delegate = self;

}

Наконец, используйте этот метод из протокола UINavigationControllerDelegate:

#pragma mark - Navigation controller delegate
- (void)willMoveToParentViewController:(UIViewController *)parent
{
    // If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed
    if (!parent) {
        NSLog(@"Back button pressed");

        // it can be useful to store this into a BOOL property
        self.backButtonPressed = YES;
    }
}
6 голосов
/ 23 апреля 2012
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 52, 31)];
[backButton setBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal];
//[backButton setTitle:@"CLOSE" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[backButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14.0f]];
[backButton addTarget:self action:@selector(tappedBackButton:) forControlEvents:UIControlStateHighlighted];

UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithCustomView:backButton];

self.navigationItem.leftBarButtonItem = item;
[item release];

Создайте пользовательскую кнопку «Назад» и с помощью этого селектора вызовите нужный метод. А также используйте [self.navigationController popViewControllerAnimated: TRUE];

- (void)tappedBackButton:(id)button
{
    // call your method here
    [self.navigationController popViewControllerAnimated:TRUE];
} 
1 голос
/ 23 января 2012

Самый простой способ - поместить код в ViewController, который будет отображаться при нажатии кнопки «Назад».Вы можете использовать viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
     //Your code here
}

Обратите внимание, что это также будет выполняться при представлении представления по любой другой причине, поэтому, если вы хотите, чтобы это происходило только при нажатии кнопки «Назад», вы должны использоватьделегат: UINavigationControllerDelegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...