UITextView如何在iPhone上隐藏键盘

9
我想在iPhone的UITextView对象中,当用户按下Return键时隐藏键盘。然而,神奇的是这对于UITextView不起作用,但对于UITextField起作用。我无法弄清楚原因...
这是我做的事情:
1)在XCode4中创建了一个基于视图的应用程序。
2)在.xib中创建了UITextViewUITextFieldUIButton对象。
3)在Outlets中将UITextFieldUITextView委托给File's Owner。
4)在.h中添加<UITextFieldDelegate>到@interface UIViewController。
5)在.m中添加textFieldShouldReturn函数。
以下是代码: .h文件
@interface keyboardDisappearViewController : UIViewController <UITextFieldDelegate>
{

    UITextView *textBoxLarge;
    UITextField *textBoxLittle;
}
@property (nonatomic, retain) IBOutlet UITextView *textBoxLarge;
@property (nonatomic, retain) IBOutlet UITextField *textBoxLittle;

- (IBAction)doSomething:(id)sender;
@end

.m file

- (BOOL) textFieldShouldReturn:(UITextField *)theTextField 
{
    NSLog(@"textFieldShouldReturn Fired :)");
    [textBoxLarge resignFirstResponder];
    [textBoxLittle resignFirstResponder];
    return YES;
}

令人惊讶的是,在textBoxLittle(UITextField)中,键盘消失了,但在textBoxLarge(UITextView)中没有消失。

为了进一步检查,我将按钮设置为调用函数doSomething。

- (IBAction)doSomething:(id)sender {
    [textBoxLarge resignFirstResponder];
    [textBoxLittle resignFirstResponder];
}

当我按下按钮时,键盘会在两个文本框中消失。让我感到困惑的是,textFieldShouldReturn 对于小文本框有效,但对于大文本框无效。请帮忙!
7个回答

20

三件事情:

让你的视图实现UITextViewDelegate。

@interface keyboardDisappearViewController : UIViewController
    <UITextFieldDelegate, UITextViewDelegate>

添加以下方法:

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

在接口构建器中将文件所有者设置为UITextView的代理。

(顺便说一句:解决方案复制自先前答案的评论,因为我花了一些时间才提取出来。我认为其他人也可能从我的经验中受益。)


7

您需要在UITextViewDelegate中编写代码,并将其分配给您的类。


6
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]) { [textView resignFirstResponder]; } return YES; }这段代码的作用是,当用户在UITextView中输入文字时,如果用户输入了换行符"\n",则让UITextView放弃第一响应者的身份并返回YES。 - Abdurrashid Khatri
我明白了,我已经写了 @interface keyboardDisappearViewController:UIViewController<UITextFieldDelegate>。如何同时写 <UITextFieldDelegate><UITextViewDelegate> - jerrymouse
在.m文件中添加yeah。在.h文件中像你为textfeilddelegate一样遵循uitextviewdelegate。 - Abdurrashid Khatri
1
简单: <UITextFieldDelegate,UITextViewDelegate> - Abdurrashid Khatri
不,我的代码和之前一样。我只是将<UITextFieldDelegate>更改为@interface keyboardDisappearViewController: UIViewController <UITextViewDelegate>。textBoxLittle已经很好地工作了。我发现添加/删除<UITextFieldDelegate>对textBoxLittle没有任何影响...只有uitextview才会出现问题。 - jerrymouse
显示剩余2条评论

5

简单技巧 为您的文本视图设置delegate,然后

doSomething 
{

}

连接到外部视图以响应control event didEndOnExittuchupinside动作。


// 当用户点击“Enter/Return”时,可用于关闭键盘。

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

0

关键点

  • 需要有人监听回车键的按下

    • UITextFieldDelegate
    • textFieldShouldReturn(textField : UITextField)
  • 需要有人手动关闭键盘

    • resignFirstResponder()

#1: 创建一个UITextFieldDelegate并将其分配为您的UITextField的代理 -

exampleTextField.delegate = yourUITextFieldDelegate;

#2: 在 'yourUITextFieldDelegate' 中包含以下内容 -

func textFieldShouldReturn(textField : UITextField) -> Bool {

    self.titleField.resignFirstResponder();   //Here's the key!!!!!

    return true;                              //true just says 'default behavior'
} 

0

如果你像我一样来到这里寻找 Swift 的解决方案,那么你来对地方了 :)

extension keyboardDisappearViewController : UITextViewDelegate {
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if(text == "\n") {
        textView.resignFirstResponder()
    }
    return true
}}

0

使用此代码

在您的Viewcontroller中继承UITextViewDelegate协议并添加文本

@interface YourViewController () <UITextViewDelegate>

在viewDidLoad中将自己设置为代理:
yourUITextView.delegate = self;

实现以下委托方法:

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{ 
   return NO; 
}

-1

你已经在 .h 文件中编写了代码:

@interface keyboardDisappearViewController : UIViewController <UITextFieldDelegate>
{
    UITextView *textBoxLarge;
    UITextField *textBoxLittle;
}
@property (nonatomic, retain) IBOutlet UITextView *textBoxLarge;
@property (nonatomic, retain) IBOutlet UITextField *textBoxLittle;

- (IBAction)doSomething:(id)sender;
@end

应该是:

@interface keyboardDisappearViewController : UIViewController <UITextFieldDelegate>
{
    UITextView *textBoxLarge;
    UITextField *textBoxLittle;
}
@property (nonatomic, retain) IBOutlet UITextField *textBoxLarge;
@property (nonatomic, retain) IBOutlet UITextField *textBoxLittle;

- (IBAction)doSomething:(id)sender;
@end

你改变了 IBOutlet,但没有改变 ivar?他可能一开始就不应该有 ivar,而是让编译器合成它,但肯定 ivar 不匹配属性是不好的。而且,无论如何,告诉他不要使用 UITextView 只是回避了问题,因为这正是他试图解决的问题。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接