2010-10-24 3 views
4

У меня есть пользовательский UIAlertView.I имеет UITextField в этом AlertView, который становится первымResponder, как только он будет показан. Теперь мне нужно убрать клавиатуру для этого UITextField, когда пользователь прикасается где-то еще в AlertView. Для этого я прикоснулся к этому событию.Увольнение клавиатуры для UITextField в UIAlertView

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

Я искал решение и нашел аналогичную должность here без каких-либо ответов

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

UIWindow* tempWindow; 

    // Because we cant get access to the UIKeyboard throught the SDK we will just use UIView. 
    // UIKeyboard is a subclass of UIView anyways 
    UIView* keyboard; 

    // Check each window in our application 
    for(int c = 0; c < [[[UIApplication sharedApplication] windows] count]; C++) 
    { 
     // Get a reference of the current window 
     tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:c]; 
     for(int i = 0; i < [tempWindow.subviews count]; i++) 
     { 
      // Get a reference to the current view 
      keyboard = [tempWindow.subviews objectAtIndex:i]; 

      // Loop through all views in the current window 

      if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES){ 
       [keyboard removeFromSuperview]; 
      } 

     } 
    } 

ответ

1

Вы используете пользовательский код для отображения клавиатуры? Если нет, попробуйте использовать код от this StackOverflow question. Я подозреваю, что сообщение resignFirstResponder не доходит до правильного управления.

(Код в этом ответе нет, как правило, полезно и катастрофически не хватает из SDK, ИМХО.)

7

Вы должны вызвать resignFirstResponder на UIAlertField,

например:

[textField resignFirstResponder];[alertView resignFirstResponder]; 
+0

Это действительно помогает! Благодаря! – hawshy

+0

Сколько firstResponders там все равно? –

0

Там нет необходимо отправить resignFirstResponder в подкласс UIAlertView. Просто переопределите becomeFirstResponder, чтобы вернуть NO в UIAlertView подкласс.

0

По-видимому, когда вы уходите с первого ответчика на UITextField, UIAlertView становится следующим ответчиком, сохраняя клавиатуру на какой-то непонятной причине.
Отказ от того, что он тоже заставляет клавиатуру исчезнуть или лучше переопределить startFirstResponder, чтобы вернуть NO. В моем случае это решение делает анимацию UIAlertview в верхнем левом углу и анимируется на месте сразу после того, как выглядит очень уродливо, и я не могу понять, почему это так, но, возможно, у кого-то есть некоторые мысли по этому поводу? Вот мой код экстракта в класс, производный от UIAlertView:

- (BOOL)becomeFirstResponder 
{ 
    return NO; 
} 

- (void)someCustomButtonClicked:(id)sender 
{ 
    [textField resignFirstResponder]; 
    // ... 
} 
1
[self resignFirstResponder]; 

self означает UIAlertView.

В моем случае это работает.

0

Попробуйте эти методы

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Welcome" message:@"Please Enter Login and Password" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [loginAlert setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput]; 
    [loginAlert textFieldAtIndex:0].delegate = self; 
    [loginAlert textFieldAtIndex:1].delegate = self; 
    [loginAlert setTag:777]; 
    [loginAlert show]; 
    [loginAlert release]; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 

    return YES; 
} 

И вы должны (Дополнительный текст, потому что переполнение стека требует, по меньшей мере, 20 символов.) добавьте UITextFieldDelegate в файл заголовка.

0

Я встретил проблему только сейчас. Вот как я решил эту проблему:

Во-первых, сделать свой textField.delegate = self;

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:nil delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"OK", nil, nil]; 

    UITextField *oldPassWord = [alertView textFieldAtIndex:0]; 
    oldPassWord.delegate =self; 

    UITextField *newPassWord = [alertView textFieldAtIndex:1]; 
    newPassWord.delegate =self; 

    [alertView show]; 

Затем [textField resignFirstResponder];

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    [[alertView textFieldAtIndex:buttonIndex]resignFirstResponder]; 
} 
Смежные вопросы