Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
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
Для полноты, сочетание двух наиболее употребительных ответов ( 1 , 2 ) в Свифте:
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
// view controller is popping
}
}
Лучшее решение, которое я обнаружил для обнаружения кнопки обратной кнопки 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
}
Создайте пользовательскую кнопку на задней панели и установите цель,
. Шаг 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. Вы можете играть с ним так, как хотите.
Приветствия!
в вашем режиме проверки методаWillDisappear
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController]) {
//specific stuff for being popped off stack
}
}
Это только для пост iOS 5
UINavigationController имеет свойство delegate
, которое вызывает обратные вызовы делегатов. См. ссылку на iOS здесь .
У делегата нет обратного вызова «назад кнопка», но вместо этого он сообщает вам, когда что-то появится в стеке навигации , Когда вы нажимаете «назад», вы «выталкиваете» контроллер верхнего уровня со стека, поэтому он скажет вам, что появится представление. Я думаю, что это обратный вызов, который вы искали.
У вас может быть какая-то простая логика, чтобы проверить, является ли это контроллером представления, «заинтересованным», а затем вы можете отправить уведомление и т. Д.
Это немного другой сценарий, но я думал, что решение может помочь другим.
В моей ситуации у меня был 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 +
Надеюсь, это поможет.