MonoTouch - повторно использовать UIAlertVIew?

Следует ли по возможности повторно использовать экземпляры UIAlertView?

Или лучше всего обернуть их в блок использования?

  • В одном случае я создал (немодальный) класс MessageBox (так же, как WinForms или WPF). Я в основном использую его для удобства.
  • Другая ситуация — это пользовательский UIAlertView, который я создал в подклассе с более сложной компоновкой. Я подключаю событие Dismissed, чтобы поработать при закрытии.

Будет ли любая из этих ситуаций требовать другого подхода?


person jonathanpeppers    schedule 01.09.2010    source источник


Ответы (2)


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

с другой стороны, LoadingHUDView является хорошим примером необходимости кодирования функциональности для более сложных вещей...

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

person Community    schedule 02.09.2010
comment
Я согласен с @CVista .. uialertview настолько легкий, что от сохранения объекта на потом мало пользы. Обычно я просто использую его внутри блока, и этого достаточно. - person Eduardo Scoz; 02.09.2010

Вот как вы можете сделать свой UIAlertView модальным:

Для этого вы можете запустить mainloop вручную. Мне не удалось остановить основной цикл напрямую, поэтому вместо этого я запускаю основной цикл на 0,5 секунды и жду, пока пользователь не ответит.

Следующая функция показывает, как вы могли бы реализовать модальный запрос с помощью описанного выше подхода:

int WaitForClick ()
{
    int clicked = -1;
    var x = new UIAlertView ("Title", "Message",  null, "Cancel", "OK", "Perhaps");
    x.Show ();
    bool done = false;
    x.Clicked += (sender, buttonArgs) => {
        Console.WriteLine ("User clicked on {0}", buttonArgs.ButtonIndex);
    clicked = buttonArgs.ButtonIndex;
    };    
    while (clicked == -1){
        NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5));
        Console.WriteLine ("Waiting for another 0.5 seconds");
    }

    Console.WriteLine ("The user clicked {0}", clicked);
    return clicked;
}
person miguel.de.icaza    schedule 26.01.2011
comment
Будет ли лучшим решением использовать ManualResetEvent в сочетании с анонимным методом? в то время как (правда) со сном мне кажется довольно плохо. Также кажется не по теме вопроса, стоит ли повторное использование UIAlertView того или нет. - person jonathanpeppers; 27.01.2011
comment
Вам нужно перекачивать события, поэтому вы должны вызывать NSRunLoop.Current.Run или RunUntil. А вот метод iOS от пробития методом Run не работает, из-за чего помпу нужно использовать с таймаутом. Ваш подход будет просто блокировать и даже не обновлять и не рисовать. Попробуй сам. - person miguel.de.icaza; 27.01.2011
comment
Вы правы, потому что это работает в потоке пользовательского интерфейса. Сначала это выглядело как (плохой) while(true) Application.DoEvents(), который я видел, как люди делали в WinForms. Отстой, что вы делаете это на iPhone, потому что нет ShowDialog(), который создаст вложенный насос сообщений. - person jonathanpeppers; 15.02.2011
comment
Это приводит к зависанию приложения (невозможно нажимать кнопки, а цикл while просто продолжается) по крайней мере в 2 ситуациях, о которых я знаю: 1. Отобразить UIAlertView, а затем повернуть устройство или 2. Если вы отображаете UIAlertView из EntryEnded (т. е. проверка, требующая ввода), но вы только что щелкнули элемент, который вызвал бы прокрутку. - person danmiser; 28.02.2014