2013-10-04 2 views
1

У меня есть UITextField и кнопка сохранения, когда пользователь нажимает кнопку «Сохранить». Я хочу всплывать оповещение, чтобы подтвердить, хочет ли он сохранить и ждать ответа. Но, к сожалению, кажется, что представление предупреждения не останавливает выполнение или ждет ответа пользователя. так как я могу реализовать такую ​​ситуацию.Как заставить выполнение основного потока ждать, пока действие UIButton

- (IBAction)Savebuttonaction:(UIButton *)sender 
{ 
    UIAlertView *view=[[UIAlertView alloc]initWithTitle:@"message" message:@"Do you want to save" delegate:self cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil]; 
    [view show]; 
    if(_isSaveConfirm) 
     NSLog(@"Saved"); 
    else 
     NSLog(@"Not Saved"); 
} 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex==0) 
    { 
     _isSaveConfirm=YES; 
    } 
    else 
    { 
     _isSaveConfirm=NO; 
    } 
} 

Обратите внимание, что я не могу написать дальнейшие шаги в методе делегата alertview. поэтому, пожалуйста, предоставьте альтернативное решение.

+0

Обновите и подробно расскажите о своей функциональности своим вопросом с кодом, каким бы вы ни пытались до сих пор. – Tirth

+0

На самом деле я просто упростил вопрос, чтобы сэкономить много деталей. поэтому мне нужно сделать простой код, просто подождите – Raon

+0

ОК, не спешите и редактируйте. – Tirth

ответ

0

Вы должны обрабатывать реакцию пользователя следующим образом.

- (IBAction)Savebuttonaction:(UIButton *)sender 
{ 
    UIAlertView *view=[[UIAlertView alloc]initWithTitle:@"message" message:@"Do you want to save" delegate:self cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil]; 
    [view show]; 

} 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex==0) 
    { 
     // put your logic to save 
     NSLog(@"Saved"); 
    } 
    else 
    { 
     // if you want handle this response 
     // put your logic here, otherwise 
     // don't handle it. 
     NSLog(@"Not Saved"); 
    } 
} 
+0

К сожалению, я не могу этого сделать! ..., пожалуйста, прочитайте вопрос, я не могу реализовать логику сохранения в методе делегата, и мне нужен элемент управления в действии кнопки сохранения – Raon

0

Вы пробовали BlocksKit?

[UIAlertView showAlertViewWithTitle:@"message" 
          message:@"Do you want to save" 
        cancelButtonTitle:@"Yes" otherButtonTitles:@[@"No"] 
          handler:^(UIAlertView *alertView, NSInteger buttonIndex) { 
         if (buttonIndex == 0) { 
          NSLog(@"Saved"); 
         } else { 
          NSLog(@"Not Saved"); 
         } 
        }]; 
0

Вы хотите этого?

- (void)buttonClicked:(id)sender { 
    __block BOOL userClicked = NO; 
    NSLog(@"Show alert"); 
    [UIAlertView showWithTitle:@"Synchronized Alert" message:@"" cancelButtonTitle:@"NO" otherButtonTitles:@[@"YES"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) { 
     NSLog(@"Alert clicked"); 
     userClicked = YES; 
    }]; 
    while (!userClicked) { 
     NSDate* timeout = [NSDate dateWithTimeIntervalSinceNow:1.f]; 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeout]; 
    } 
    NSLog(@"Do something else"); 
    // ... 
} 

Коды выше зарегистрирует:

2013-12-09 20:21:07.612 [14728:60b] Show alert 
2013-12-09 20:21:14.739 [14728:60b] Alert clicked 
2013-12-09 20:21:14.775 [14728:60b] Do something else 

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

Примечание: Приведенный выше код не будет работать, если вы звоните метод @sel(buttonClicked:) в блоке, а затем назначить блок в очередь отправки, а @rob mayoff отметил в NSRunLoop runMode does not always process dispatch_async, «Если очередь выполняет блок, никаких других блок в этой очереди может начаться ».

Смежные вопросы