2009-05-19 10 views
4

Я использую несколько UIAlertViews в моем коде следующим образомUIAlertView не ждет

-(void) myfunc 
{ 
    myAlertView1 = [[UIAlertView alloc] initWithTitle:@"Message" message:[list objectAtIndex:1] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [myAlertView1 show]; 
    [myAlertView1 release], myAlertView1 = nil; 
    { 
     do something 
    } 
    myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[list   objectAtIndex:1] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [myAlertView show]; 
    [myAlertView release], myAlertView = nil; 
} 

При запуске программы в симуляторе я вижу myAlertView1 (Message) на короткое время и не ждет Ok нажатия кнопки затем Я вижу myAlertView (Ошибка), который ждет нажатия кнопки Ok, после чего я снова вижу myAlertView1 (Message), и он ждет нажатия кнопки OK.

Логически я хочу видеть myAlertView1 (Сообщение) и ждать, пока нажата кнопка Ok, а затем нажмите myAlertView (Ошибка) и нажмите кнопку до щелчка. Я что-то упустил?

ответ

12

UIAlertView не является модным, как можно было бы ожидать. Вам следует дождаться, когда ваш делегат получит alertView:didDismissWithButtonIndex: перед созданием и показом второго UIAlertView

0

Вот как вы можете сделать свой диалог модальным.

Я столкнулся с этим, исследуя аналогичный вопрос у пользователя MonoTouch/C#, поэтому я написал для него этот образец. Тот же образец может быть тривиально перенесен в Objective-C.

Чтобы сделать это, вы можете просто запустить mainloop вручную. Мне не удалось остановить mainloop напрямую, поэтому вместо этого я запустил 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; 
} 
+0

не работает на IOS. Сам UIAlertView не отображался перед входом в цикл while. – Gagan

0

Здесь вы можете сделать это следующим образом:

-(void) myfunc 
{ 
    myAlertView1 = [[UIAlertView alloc] initWithTitle:@"Message" message:[listobjectAtIndex:1] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [myAlertView1 show]; 
    [myAlertView1 release], myAlertView1 = nil; 
    { 
     do something 
    } 
} 

И когда вы получите alertview, вы можете нажмите кнопку «ОК», которая вызывает другой метод, чтобы открыть другое предупреждение.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if(buttonIndex==0) 
    { 
     [self open_secondAlert]; 
    } 
} 

-(void)open_secondAlert 
{ 
    myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[list objectAtIndex:1] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [myAlertView show]; 
    [myAlertView release], myAlertView = nil; 
} 

Пожалуйста, дайте мне знать, если у вас остались вопросы.

Спасибо, С наилучшими пожеланиями, Gurprit

+0

ARC запрещает явное сообщение отправить 'release'. – parsley72