2012-01-23 2 views
13

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

ответ

15

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

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

Другое решение - добавить пользовательский ответчик к кнопке «Назад». Вы можете изменить метод инициализации вашего 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]; 
} 
+4

Одно из различий между ними состоит в том, что первое решение (то есть 'viewWillDisappear') вызывается при возврате или переходе через стек навигации. Второе решение - только для того, чтобы вернуться. – Matthew

+5

Это обычно не работает, так как вы обнаружите, что backBarButtonItem равен нулю, если вы явно не назначили ему кнопку. Как бы то ни было, оба метода leftBarButtonItem и backBarButtonItem были равны нулю. – Diziet

+3

не работает –

1

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

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

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

+0

, что метод будет вызываться, когда это появляется ВК вообще, не обязательно только в результате просто вернуться к нему – Colin

+1

@Colin, что является правильным, это зависит от конкретного поведения он хочет, он может использовать делегат, если он только хочет, когда нажата кнопка «Назад». –

6
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]; 
} 
+0

Обратите внимание, что при замене кнопки «Назад» вы теряете «проведите пальцем по левому краю, чтобы вернуться к функции parentController», которая была введена в iOS 7 и является полезной ярлык на iPhone 6 и 6+ –

+0

Это не работает с self.navigationItem.rightBarButtonItem ... Пожалуйста, дайте другое решение – Vidhi

6

Я думаю, что нашел «чистый» способ сделать это:

Во-первых, установить контроллер представления в соответствие с протоколом 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; 

} 

Последнее, используйте этот метод из UINavigationControllerDeleg съела протокол:

#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; 
    } 
} 
Смежные вопросы