2010-07-27 3 views
6

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

Я создал UIAlertView, чтобы пригласить пользователя ввести свое имя в приложении для iPhone.

UIAlertView *enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert addSubview:enterNameField]; 

    [enterNameAlert show]; 
    [enterNameAlert release]; 
    [enterNameField release]; 

Я настроить этот ViewController соблюдать UITextFieldDelegate в заголовочном файле, и реализован textFieldShouldReturn: пытается закрыть клавиатуру, когда пользователь нажмите Готово.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 

В отладчике, я подтверждаю, что этот метод вызывается успешно, когда я нажимаю на кнопку Готово, с TextField быть первым ответчиком в то время. Однако клавиатура не исчезает, но маленький clearButton уходит. Понятно, что textField больше не является первым ответчиком, потому что, когда я снова нажимаю кнопку «Готово», ничего не вызывается. Я просто хочу убрать клавиатуру с помощью кнопки «Готово». Может ли кто-нибудь предложить решение? Миллион спасибо.

+0

Что произойдет, если вы установите текстовое поле как свойство в своем контроллере просмотра, тем самым гарантировав, что вы его сохранили даже после того, как предупреждение было уволено? Мне интересно, возможно ли, что он освобождается до того, как цикл событий приблизится к отправке сообщения resignFirstResponder или чего-то странного. P.S. Мы работали вместе? – clozach

ответ

6

Сначала вы должны определить свой enterNameAlert в заголовке интерфейса. затем используйте приведенный ниже код.

- (void)viewDidLoad {  
    [super viewDidLoad]; 
    enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self;  
    [enterNameAlert addSubview:enterNameField]; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert show];  
    [enterNameField release]; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     [enterNameAlert dismissWithClickedButtonIndex:1 animated:YES]; 
     [enterNameAlert release]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 
+0

Это работает !! Но мне нужно удалить [enterNameAlert release] из метода textField текстового поля - (BOOL) textFieldShouldReturn: (UITextField *). В противном случае приложение просто выйдет из строя и уйдет после нажатия кнопки «Готово». Но я не очень хорошо разбираюсь в материалах памяти. Будет ли утечка памяти при этом? – Anthony

+0

Если вы не хотите выпускать enterNameAlert в textFieldShouldReturn. Все нормально. Но вам придется выпустить его в другом месте внутри реализации. скажем: -dealloc { [enterNameAlert release]; [super dealloc]; } –

+0

Хм, [не работает для меня] (http://stackoverflow.com/q/6866932/434423). –

0

Что произойдет, если вы переместите выделение текстового поля на метод делегата после вызова метода resignFirstResponder?

+0

Спасибо за помощь. Но это не работает. – Anthony

0

Попробуйте отменить клавиатуру, используя resignFirstResponder на событии «DidEndOnExit» вашего TextField.

Затем попробуйте убрать клавиатуру, нажав кнопку «Готово» на клавиатуре, когда вы закончите вводить данные в свой текстовый фильтр.

Надеюсь, это поможет.

+0

Реализовать resignFirstResponder на - (IBAction) DidEndOnExit: (ID) отправителя { // Ваш код здесь идет } –

+0

ли это выше помощь решение? –

+0

Спасибо за помощь. Но это не работает. – Anthony

0

Идет еще один объект, а затем немедленно смирится с первым ответчиком.

+0

Извините, я не уверен, как я могу это достичь. – Anthony

0

просто сделать

[mytextField addTarget:self 
      action:@selector(methodToFire:) 
      forControlEvents:UIControlEventEditingDidEndOnExit]; 
0

если кто-то возникают проблемы с этим в раскадровке я должен был пойти в мои uitextfields свойства и Ctrl + сопротивление от своего делегата к своему контроллеру вида корневых все в раскадровке и что исправлено все ..

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