2013-05-17 2 views
1

Я создал UIAlertViewКак отличить UIAlertView Отмена и возврат текста в UIAlertViewStyleSecureTextInput?

alert = [[UIAlertView alloc] initWithTitle:@"Test" 
            message:@"Working" 
            delegate:self 
         cancelButtonTitle:@"Ok" 
         otherButtonTitles:nil]; 

[alert setAlertViewStyle:UIAlertViewStyleSecureTextInput]; 
alert.tag = kAlertTypePIN; 

UITextField *textField = [alert textFieldAtIndex:0]; 
textField.delegate = self; 

Если я нажимаю Retun ключ в UIAlertView TextField он отлично работает, он вызывает:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
} 

, а затем

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    NSLog(@"didDismissWithButtonIndex"); 
    // If no text or wrong text show alert again otherwise normal actions 
} 

Но если нажать cancel, это 1-й вызов textFieldDidEndEditing, который, в свою очередь, вызывает делегата предупреждения. И снова он вызывает метод делегата alert.

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

Если у вас возникнут сомнения в потоке, пожалуйста, спросите меня.

Как исправить проблему?

ответ

-1

Попробуйте

Добавить UIAlertView следующий метод делегата

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

{

[[alert textFieldAtIndex:0] resignFirstResponder];

}

0

Вы просто хотите скрыть UIAlertiView на отменить клик?

Тогда, если ваш отменить buttonindex 1, то:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; 

    if(buttonIndex == 1) { 
     [[alert textFieldAtIndex:0] resignFirstResponder]; 
    } 
} 
0

попробовать это состояние .. как вы не хотите, чтобы предупреждение исчезнет, ​​когда Pin не там ...

- (void)textFieldDidEndEditing:(UITextField *)textField 
    { 
     if([textField.text length]!=0) 
     [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    } 
1

сбросить значение делегат TextField в alertView:willDismissWithButtonIndex:

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { 
    UITextField *textField = [alert textFieldAtIndex:0]; 
    textField.delegate = nil; 
} 

Когда предупреждение отклоняется, текстField закончит редактирование, а затем он вызовет метод делегирования textFieldDidEndEditing:.
Если вы установите делегат на ноль до начала увольнения, метод делегата не может быть вызван.

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

0

Если вы хотите скрыть UIAlertiView на кнопку «Отмена», нажмите затем просто добавить этот код clickedButtonAtIndex:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if(buttonIndex == 1) 
    { 
      [[alert textFieldAtIndex:0] resignFirstResponder]; 
    } 
} 
+0

Nope. У меня два потока. Оба потока должны войти в код, присутствующий в функции didDismissWithButtonIndex. Там я проверяю, является ли введенный текст недопустимым или нулевой длины, и если это так, я снова запустил одно и то же предупреждение. Один поток работает отлично - когда я нажимаю кнопку «Возврат» текстового поля alertview. 2-й поток не работает - когда я нажимаю кнопку «Отмена» в AlertView. Он вызывает endEditing 1-й, а затем делегат представления предупреждений. – wolverine

+0

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

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