我有一个文本字段,当我触摸屏幕上的其他位置时(通过我的 TouchesBegan 函数并辞职......等等),它会隐藏键盘。但是当我触摸 Textview 时,TouchesBegan 不会被调用,键盘也不会隐藏!有什么方法可以调用 TouchesBegan 来隐藏键盘?
3 回答
我假设您的 UITextView 不可编辑,因为您不希望在触摸它时弹出键盘,因此请确保在 UITextView 的视图属性中未选中“启用用户交互”。你也可以在你的 ViewController 中这样写:
textView.userInteractionEnabled = NO;
这将允许用户事件传递到超级视图,并调用 touchesBegan 和其他委托方法。
我见过的最好的方法是添加一个覆盖文本视图并首先处理 TouchesBegan 的透明子视图。然后,您可以检测文本字段外的触摸并通过让文本字段作为第一响应者来关闭键盘。
例如,在 IB 中或以编程方式创建覆盖子视图,无论哪种方式。放置并调整大小,使其覆盖文本视图,并赋予其清晰的颜色。如果您通过 IB 添加视图,请在加载主视图时将其隐藏,以便它不会吸收触摸,如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
overView.hidden = YES;
}
然后当文本字段开始编辑时,取消隐藏视图:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
overView.hidden = NO;
}
当文本字段结束编辑时,重新隐藏视图:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
overView.hidden = YES;
}
添加一个 touchesBegan 来检测您未隐藏的 overView 何时被触摸:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
// Resign first responder if touch is outside text field
if ([touch view] != myTextField)
[myTextField resignFirstResponder];
// Send touches up the responder chain (pass them through)
[self.nextResponder touchesBegan:touches withEvent:event];
}
您也可以通过自定义手势来做到这一点,但这仅适用于 iOS 4.x,而且在我看来,它更复杂。
还有一种简单的方法可以在 touchesBegan 上隐藏键盘:当您使用 UITextView 输入数据时。
步骤 1. 确保在类声明时扩展了 Textviewdelegate。
@interface YourClassName : UIViewController { IBOutlet UITextView *txtMyView; }
步骤 2. 在视图中将委托设置为 self 并执行加载功能。
- (void)viewDidLoad
{
txtMyView.delegate = self;
}
步骤 3. 在 touchesbegan 函数中使用您的 textView 名称编写类似的代码。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[txtMyView resignFirstResponder];
[super touchesBegan:touches withEvent:event];
}
谢谢并恭祝安康。