dismissModalViewControllerAnimated mystery - PullRequest
0 голосов
/ 13 июня 2011

Я видел несколько постов на эту тему, но ни один из них не оставляет у меня четкого понимания происходящего.

Я настроил небольшой тест, включающий два 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 снова не работает, независимо от того, как долго я использую задержку.

Итак, что здесь происходит? Я понимаю, что, как и другие, я могу достичь своей цели с помощью различных обходных путей, включая использование делегата и т. Д. Но я действительно считаю, что для всех, кто сталкивается с этой проблемой, было бы хорошо уйти с полным пониманием как проблемы, так и правильное решение для этого сценария. Между прочим, один вариант использования для этого сценария состоит в том, чтобы представить экран загрузки модально, где пользователь не взаимодействует с этим экраном; он просто используется для представления информации, в то же время блокируя действия пользователя.

1 Ответ

1 голос
/ 13 июня 2011

Представление анимируется, поэтому, пока оно оживляет, вызов dismiss не будет работать.

Также во втором, что вы попробовали, вы вызываете «задержку», но на самом деле вы говорите следующее: «Хорошо, вот этот симпатичный метод, можете ли вы выполнить этот 0,41 секунды позже? среднее время, вызовите этот метод .. "

Отказ от модального контроллера представления должен быть сделан через пользовательский интерфейс, нажав кнопку, так почему вы пытаетесь это сделать в первую очередь?

...