Дождитесь завершения PresentModalViewController (монотушение) - PullRequest
2 голосов
/ 22 декабря 2011

Я хотел бы дождаться отображения контроллера с помощью PresentModalViewController (), чтобы завершить свою работу, прежде чем возобновить выполнение (например, модальные диалоги в WinForms).Как это можно сделать с помощью monotouch?

Я знаю, что есть аналогичный вопрос для SO, но ответ для Objective-C и, честно говоря, я не понимаю.

Большое спасибо.


РЕДАКТИРОВАТЬ

Вот первая настройка, которую я пробовал и которая, похоже, не работает:

  1. Создать новый проект (приложение с одним представлением);
  2. Добавить два контроллера (iPhone View Controller): FirstController и SecondController;первый контроллер переопределяет DismissModalViewControllerAnimated и запускает событие OnFirstFinished сразу после его закрытия;
  3. в главном контроллере:

...

public partial class TestModalViewController : UIViewController
{
    private UIButton button;
    private FirstController first;
    private SecondController second;

    public override void ViewDidLoad ()
    {
      base.ViewDidLoad ();

      button = UIButton.FromType(UIButtonType.RoundedRect);
      button.Frame = new RectangleF(0, 0, 100, 50);
      button.SetTitle("Test", UIControlState.Normal);
      button.TouchUpInside += PresentFirstController;

      View.Add(button);

      PresentFirstController(null, null);
    }

    void PresentFirstController (object sender, EventArgs e)
    {
      bool firstFinished = false;

      first = new FirstController();

      first.OnFirstFinished += delegate(object s, EventArgs args) {
        firstFinished = true;
      };

      this.PresentModalViewController(first, true);

      do
      {
        NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5));
      } while (!firstFinished);

      second = new SecondController();
      this.PresentModalViewController(second, true);

    }

    // ...
}
В FirstController:

...

public override void DismissModalViewControllerAnimated (bool animated)
{
    base.DismissModalViewControllerAnimated (animated);

    if(null != OnFirstFinished)
    {
        OnFirstFinished(this, null);
    }
}

В этой настройке блоки выполнения (черный экран загрузки) и первый контроллер не загружаются.

Если вызов метода PresentFirstController () удален из ViewDidLoad (), основной контроллер загружается нормально, и при нажатии кнопки «Тест» загружается первый контроллер.Однако после того, как первый контроллер уволен, второй контроллер НЕ загружается - iOS, похоже, не нравится представлять модальный контроллер сразу после закрытия другого.Это можно решить, добавив небольшую задержку (но насколько она все еще безопасна?), Как показано ниже:

public override void DismissModalViewControllerAnimated (bool animated)
{
    base.DismissModalViewControllerAnimated (animated);

    NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow(0.2));

    if(null != OnFirstFinished)
    {
        OnFirstFinished(this, null);
    }
}

1 Ответ

2 голосов
/ 22 декабря 2011

Как правило, шаблон кода, который вы хотите использовать в iOS, предназначен для цепочки этих действий. Например, ваш контроллер представления, вероятно, будет иметь поле логина / пароля и кнопку для входа в систему.

Что бы вы сделали, это подключили действие к кнопке входа в систему, которая связывается с сервером, проверяет пользователя и, если учетные данные в порядке, закрывает контроллер диалогового окна и в этот момент возобновляет выполнение.

Тем не менее, вы можете представить контроллер представления и запустить основной цикл пользовательского интерфейса вручную и подождать, пока какое-либо событие не сработает, прежде чем возобновить выполнение.

do {
    NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5));
} while (!done);

Вы можете избавить себя от боли и структурировать свой код с помощью шаблонов UIKit вместо того, чтобы пытаться бороться с ними. Вы сэкономите время.

...