isBeingDismissed не установлен в viewWillDisappear:
У меня есть код для очистки в моем viewWillDisappear:
, который я хочу использовать, только когда представление возвращается к родительскому контроллеру представления.
- (void)viewWillDisappear:(BOOL)animated
{
if ([self isMovingFromParentViewController] || [self isBeingDismissed]) {
NSLog(@"isMovingFromParentViewController or isBeingDismissed");
// clean up
}
[super viewWillDisappear:animated];
}
Представление может быть представлено двумя способами: оно может быть передано контроллером навигации или представлено как модальный контроллер представления (из того же контроллера навигации). Если нажать, затем нажать (нажать кнопку "назад"), мой код очистки запустится. Если он представлен как модальный контроллер представления, то отклонен, код не запускается.
Я увольняюсь так:
[rootViewController dismissModalViewControllerAnimated:YES];
Мой вопрос: почему нет isBeingDismissed
установить, когда я отклоняю свой контроллер вида?
5 ответов
Ваша проблема в том, как вы отклоняете свое модальное представление. Как определяется rootViewController?
Когда я звоню [self dismissModalViewControllerAnimated:YES]
затем [self isBeingDismissed]
оценивает как истинное.
Когда я звоню [parentViewController dismissModalViewControllerAnimated:YES]
затем [self isBeingDismissed]
оценивается как true, при этом parentViewController - это UIViewController, который представил модальное представление (примечание: не UINavigationController).
Если это первый контроллер вида в модальном навигационном контроллере, который отклоняется, вызывается self.isBeingDimissed()
от viewWillDisappear:
возвращается false
,
Однако, так как весь навигационный контроллер отклоняется, то, что на самом деле работает, self.navigationController?.isBeingDismissed()
, который возвращает true
,
Как упомянул @Yuval Tal, этот флаг не работает, когда вы отклоняете контроллер, встроенный в контроллер навигации. Вот расширение, которое я использую:
extension UIViewController
{
var isAboutToClose: Bool {
return self.isBeingDismissed ||
self.isMovingFromParentViewController ||
self.navigationController?.isBeingDismissed ?? false
}
}
Это может быть легко расширено, когда вы найдете другой случай, когда стандарт .isBeingDismissed
не сработает А если найдёте, дайте нам, сообщите мне в комментариях.
Если случайно вы пришли сюда, пытаясь использовать isBeingDismissed
на немодально представленном контроллере представления вы всегда можете проверить topViewController
собственность вашего navigationController
, например:
if navigationController?.topViewController != self {
return
}
viewController.isBeingPresented == NO; [rootVC presentViewController:viewController animated:NO completion:^{ viewController.isBeingPresented == NO; viewController.isBeingDismissed == NO; [viewController dismissViewControllerAnimated:NO completion:^{ viewController.isBeingDismissed == NO; }]; viewController.isBeingDismissed == NO; // is not work }]; viewController.isBeingPresented == YES; // is work
viewController.isBeingPresented == NO;
[rootVC presentViewController:viewController animated:NO completion:^{
viewController.isBeingPresented == NO;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
viewController.isBeingDismissed == NO;
[viewController dismissViewControllerAnimated:NO completion:^{
viewController.isBeingDismissed == NO;
}];
viewController.isBeingDismissed == YES; // is work
});
}];
viewController.isBeingPresented == YES; // is work