2010-10-20 2 views
21

Я пытаюсь сделать свой редактируемый UITextView отставку клавиатуры (resignFirstResponder), когда пользователь нажимает «Готово». Использование в UITextField, я был в состоянии сделать это с помощью следующего кода:Как сделать UITextView «Готово» кнопка resignFirstResponder?

- (IBAction)doneEditing:(id)sender { 
    [sender resignFirstResponder]; 
} 

... и затем прикрепить его к соответствующему UITextField в Interface Builder к действию «Конец ли на выход.»

Однако, похоже, я не могу получить доступ к действию «Закончился на выходе» UITextView. Любые предложения о том, как это сделать?

ответ

12

новый ответ

На ваш взгляд, нужно иметь UIBarButton ("Done"), который подключен к IBAction ниже:

- (IBAction)doneEditing:(id)sender { 
    [textView resignFirstResponder]; 
} 

Где TextView ваша розетка TextView определена в ваш файл .h и подключен в Storyboard или .xib-файле. Как это:

@property (retain, nonatomic) IBOutlet UITextView *textView; 

старый ответ

Проверьте следующее:

  1. ли UITextViewDelegate указанный в .h
  2. Реализовать метод делегата для UITextView: textViewShouldEndEditing, возвращение YES
  3. убедитесь, что ваш .m (контроллер) является делегатом для uitextview в IB
  4. resignFirstResponder должен теперь работать.
+0

Это должно сработать. Сделали это в некоторых моих приложениях ... – gabaum10

+2

textViewShouldEndEditing НЕ вызывается, когда пользователь нажимает кнопку Return/Done на UITextView, проверяя возврат каретки в shouldChangeTextInRange - единственный способ – valexa

+0

Неверный ответ! 'shouldChangeTextInRange' - это способ пойти ... – ElasticThoughts

84

Принятый ответ не сработал для меня. Вместо этого, следующий метод делегата должен вызываться следующим образом:

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    if([text isEqualToString:@"\n"]){ 
     [textView resignFirstResponder]; 
     return NO; 
    }else{ 
     return YES; 
    } 
} 

Paste, что в классе, присвоенным быть UITextView делегата, и он будет работать.

+10

Этот ответ пренебрег всей причиной использования UITextView, где пользователь захочет добавить несколько строк, что и делает кнопка возврата в контексте UITextView. – zachzurn

+1

Вот как это сделать! Принятый ответ НЕ работает. – ElasticThoughts

+3

@zachzurn - Я не думаю, что это относится к этому прецеденту, где есть желание иметь многострочный текст и сделанную кнопку на клавиатуре. Мне ясно, что если кнопка «Готово» действует как кнопка возврата, это будет плохой юзабилити. –

-4

Чтобы сделать проделанную кнопку, отпустите клавиатуру и resignFirstResponder, вам необходимо реализовать метод делегата.

  1. В вашем .h реализация UITextFieldDelegate

    @interface YourViewController : UIViewController <UITextFieldDelegate> 
    
  2. Затем осуществить textFieldShouldReturn в вашем ом

    -(BOOL) textFieldShouldReturn:(UITextField *)textField 
    { 
    [textField resignFirstResponder]; 
    return YES; 
    } 
    
  3. Не забудьте связать делегат UITextField к владелец файла (очень важно)

+0

простейшей, отлично работает для меня. Thanx – zxcat

+18

Вопрос, однако, о UITextView, а не UITextField ... –

+0

upvote для чего ?? OP запросил UITextView, а не UITextField ... –