UINavigationController и viewWillDisappear - PullRequest
3 голосов
/ 01 ноября 2010

Итак, в моем приложении есть UINavController, и я пытаюсь выполнить метод, когда пользователь нажимает кнопку возврата.Я искал везде и могу найти только те фрагменты, которые не имеют смысла вне контекста.

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

Ответы [ 5 ]

6 голосов
/ 21 июля 2011

Взгляните на UINavigationControllerDelegate.Есть только два метода, которые вызываются, когда UIViewController помещается в стек контроллера навигации.Точно так же, если кто-то толкается, то, вероятно, просто что-то лопнуло.Это то, что я сделал для вызова viewDidDisappear и viewWillDisappear.

# pragma mark - UINavigationControllerDelegate Methods

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    static UIViewController *vcPointer = nil;

    // If the previous view controller is still around then let's send a viewWillDisappear message
    if (vcPointer != nil) {
        if ([vcPointer respondsToSelector:@selector(viewWillDisappear:)]) {
            [vcPointer viewWillDisappear:animated];
        }
    }

    // Keep track of a pointer to the current viewController
    vcPointer = viewController;

    [viewController viewWillAppear:animated];   
}

Этот код хранит ссылку на указатель на последний контроллер представления, который был выдвинут, так что после того, как мы нажмем другой, мы можем вытолкнуть последний (если онвсе еще существует).

2 голосов
/ 01 ноября 2010

AFAIK, если вы добавите UINavigationController в UIView с помощью кода, он не будет отправлять эти сообщения в свои подпредставления по умолчанию.Это будет сделано только в том случае, если UINavigationController сам получит эти вызовы.Возможно, это ваша проблема (я не знаю, как вы настроили представление).

Так что, при добавлении представления UINavigationController, обязательно отправляйте ему эти сообщения вручную.

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController];

[navigationController viewWillAppear:NO];
[aView addSubview:navigationController.view];
[navigationController viewDidAppear:NO];

По крайней мере, это то, что я нашел во время разработки.Я долго искал это, и я до сих пор не понимаю, что за этим стоит.

0 голосов
/ 03 ноября 2010

Я использовал это решение:

  • Добавьте пользовательскую кнопку слева на панели навигации
  • Пусть эта кнопка активирует пользовательский метод.

Недостаток этого обходного пути: вы потеряете эту красивую кнопку в форме стрелки "назад".Это можно решить и с помощью собственного изображения.

Так вот мой код.Поместите это в viewDidLoad:

// LeftButton in Navigation Bar
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPushed:)];
self.navigationItem.leftBarButtonItem = leftBarButton;
[leftBarButton release]; 

Затем добавьте этот метод в тот же файл .m:

- (void) backButtonPushed: (id)sender  {
// do what you want to do       
}

не забудьте в файле .h

- (void) backButtonPushed: (id)sender;
0 голосов
/ 01 ноября 2010

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

Выполните там любой код, который вам нужен, и откройте представление.

0 голосов
/ 01 ноября 2010

viewWillDisappear & viewDidDisappear вызывается, когда контроллер отключен или отключен. Функция вызывается на контроллере переднего вида, а не на самом UINavigationController. Возможно, вы подкласс и забыли назвать супер на что-то?

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