Я видел несколько постов на эту тему, но ни один из них не оставляет у меня четкого понимания происходящего.
Я настроил небольшой тест, включающий два UIViewController: MainController и ModalController.
MainController имеет кнопку, которая представляет модальный контроллер вида с использованием следующего простого кода:
ModalController *myModal = [[ModalController alloc] init];
[self presentModalViewController:myModal animated:YES];
[myModal release];
Теперь, если я немедленно уволю этот модальный контроллер из того же блока кода, как в следующей строке:
[self dismissModalViewControllerAnimated: YES];
Модальное представление не отклоняется.
Следуя некоторым предложениям на этом сайте, я поместил вызов dismissModalViewControllerAnimated
в отдельный метод, который я затем вызвал:
[self performSelector:@selector(delayedDismissal) withObject:nil
afterDelay:0.41];
Это работает - по крайней мере, если я сделаю задержку 0,41 или больше. .40 или меньше, и это не работает.
На данный момент, я предполагаю, что имею дело с циклом выполнения, который должен догнать себя, из-за отсутствия лучшего описания. К сожалению, он не очень стабилен.
Итак, для следующего теста я заставляю delayedDismissal ничего не делать - он служит только для обеспечения задержки - и повторно вставляю вызов dismissModalViewControllerAnimated обратно в исходный блок, так что мой код теперь выглядит так:
ModalController *myModal = [[ModalController alloc] init];
[self presentModalViewController:myModal animated:YES];
[myModal release];
self performSelector:@selector(delayedDismissal) withObject:nil
afterDelay:0.41]; // to create the false delay
[self dismissModalViewControllerAnimated: YES];
... теперь dismissModalViewControllerAnimated снова не работает, независимо от того, как долго я использую задержку.
Итак, что здесь происходит? Я понимаю, что, как и другие, я могу достичь своей цели с помощью различных обходных путей, включая использование делегата и т. Д. Но я действительно считаю, что для всех, кто сталкивается с этой проблемой, было бы хорошо уйти с полным пониманием как проблемы, так и правильное решение для этого сценария. Между прочим, один вариант использования для этого сценария состоит в том, чтобы представить экран загрузки модально, где пользователь не взаимодействует с этим экраном; он просто используется для представления информации, в то же время блокируя действия пользователя.