viewDidDisappear вызван из-за завершения? [Дубликат]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

string postalcode=Customer.Address.PostalCode; 
//if customer or address is null , this will through exeption

здесь, если адрес имеет значение null, то вы получите NullReferenceException.

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

string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
61
задан Andrew 23 May 2011 в 01:57
поделиться

6 ответов

Для полноты, сочетание двух наиболее употребительных ответов ( 1 , 2 ) в Свифте:

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {
        // view controller is popping
    }
}
-8
ответ дан Community 27 August 2018 в 21:26
поделиться

Лучшее решение, которое я обнаружил для обнаружения кнопки обратной кнопки UINavigationController (pre-iOS 5.0), заключается в проверке того, что текущий контроллер просмотра отсутствует в стеке контроллера представления контроллера навигации.

Возможно, безопаснее проверить это условие в - (void)viewDidDisappear:(BOOL)animated как логически, к моменту вызова этого метода было бы крайне вероятно, что диспетчер представлений был удален из стека.

Pre-iOS 5.0:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (![[self.navigationController viewControllers] containsObject:self]) {
        // We were removed from the navigation controller's view controller stack
        // thus, we can infer that the back button was pressed
    }
}

iOS 5.0+ вы можете использовать -didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    // parent is nil if this view controller was removed
}
107
ответ дан Andrew 27 August 2018 в 21:26
поделиться

Создайте пользовательскую кнопку на задней панели и установите цель,

. Шаг 1: добавьте эти методы в свой класс

- (void)backButtonClicked :(id)sender{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)addBackBarButton{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 55, 35);
    [button setTitle:@"back" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}

. Шаг 2: Позвоните [self addBackBarButton]; in viewDiDLoad method

Вы получите действие в методе backButtonClicked. Вы можете играть с ним так, как хотите.

Приветствия!

1
ответ дан aToz 27 August 2018 в 21:26
поделиться

в вашем режиме проверки методаWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if ([self isMovingFromParentViewController]) {
      //specific stuff for being popped off stack
    }
}

Это только для пост iOS 5

78
ответ дан kevinl 27 August 2018 в 21:26
поделиться

UINavigationController имеет свойство delegate, которое вызывает обратные вызовы делегатов. См. ссылку на iOS здесь .

У делегата нет обратного вызова «назад кнопка», но вместо этого он сообщает вам, когда что-то появится в стеке навигации , Когда вы нажимаете «назад», вы «выталкиваете» контроллер верхнего уровня со стека, поэтому он скажет вам, что появится представление. Я думаю, что это обратный вызов, который вы искали.

У вас может быть какая-то простая логика, чтобы проверить, является ли это контроллером представления, «заинтересованным», а затем вы можете отправить уведомление и т. Д.

7
ответ дан makdad 27 August 2018 в 21:26
поделиться

Это немного другой сценарий, но я думал, что решение может помочь другим.

В моей ситуации у меня был UINavigationController в UIPopoverController. Мне нужно было определить, нажал ли пользователь кнопку «Назад» или щелкнул за пределами popover. Для этого я проверил свойство visibleViewController в viewWillDisappear. Если контроллер просмотра по-прежнему остается видимым элементом управления при закрытии, то popover закрывается другим способом. Если контроллер просмотра не является видимым элементом управления при закрытии, тогда была нажата кнопка «Назад».

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.visibleViewController != self) {
        <Do something since we're closing using something else>
    } else {
        <Do something since we're closing because of the back button>
    }
}

Я попытался использовать решение zach, но isMovingFromParentViewController возвращает true для обоих случаев.

I проверено это работает в iOS 5 +

Надеюсь, это поможет.

2
ответ дан Matt Becker 27 August 2018 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: