我正在尝试重新创建类似于safari中使用的弹出键盘的东西。
我可以通过在我的视图上放置一个工具栏和相应的按钮来直观地再现它,但是一旦用户触摸完成按钮,我就无法找出解除键盘的任何方法。
答案 0 :(得分:50)
您需要记住几件事。开发人员忘记设置的#1部分是textField的委托。
如果您使用的是Interface Builder,则必须记住需要将textField的委托设置为文件所有者。
如果您不使用Interface Builder,请确保将textfield的委托设置为self。我还包括returnType。例如,如果textField名为gameField:
gameField.delegate = self;
gameField.returnKeyType = UIReturnKeyDone;
您还必须为ViewController实现 UITextFieldDelegate 。
@interface YourViewController : UIViewController <UITextFieldDelegate>
最后,您需要使用 textFieldShouldReturn 方法并调用 [textField resignFirstResponder]
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
return YES;
}
所有textField都将使用相同的方法,因此您只需要进行一次此设置。只要为textField设置了委托,就为接口实现了UITextFieldDelegate,你可以添加textFieldShouldReturn方法并调用 resignFirstResponder你的设置。
答案 1 :(得分:26)
你试过了吗?
[viewReceivingKeys resignFirstResponder];
其中viewReceivingKeys
是接收文本输入的UIView?
答案 2 :(得分:6)
如果您在Interface Builder中构建自己的视图,请将视图控制器设置为文本字段的委托,并在视图控制器中从UITextFieldDelegate实现textFieldShouldReturn:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
NSLog(@"%@ textFieldShouldReturn", [self class]);
[theTextField resignFirstResponder];
// do stuff with the text
NSLog(@"text = %@", [theTextField text]);
return YES;
}
UITextFieldDelegate textFieldShouldReturn: in the iphone cocoa docs
答案 3 :(得分:2)
如果您正在谈论从UITextField
而不是UITextView
解雇键盘。你的问题不是很明确吗?如果您确保您的课程在界面文件中标记为UITextFieldDelegate
,
@interface MyController: UIViewController <UITextFieldDelegate> {
UITextField *activeTextField;
// ...remainder of code not show ...
}
然后你应该实现两个委托方法,如下所示,
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
activeTextField = textField;!
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
activeTextField = nil;
[textField resignFirstResponder];
return YES;
}
但是如果你使用的是UITextView
那么事情会有点复杂。 UITextViewDelegate
协议缺少与textFieldShouldReturn:
方法等效的方法,大概是因为我们不应期望Return键是用户希望在多行文本输入对话框中停止编辑文本的信号(毕竟,用户可能希望通过按Return键插入换行符。)
然而,有几种方法可以解决UITextView
无法使用键盘作为第一响应者辞职的问题。通常的方法是在UITextView
显示弹出键盘时在导航栏中放置完成按钮。点击时,此按钮会要求文本视图作为第一响应者辞职,然后将关闭键盘。
但是,根据您计划界面的方式,当用户点击UITextView
本身时,您可能希望UITextView
辞职。要执行此操作,您需要将UIView
子类化为接受触摸,然后在用户点击视图本身时指示文本视图重新签名。
创建一个新类
#import <UIKit/UIKit.h>
@interface CustomView : UIView {
IBOutlet UITextView *textView;
}
@end
然后,在实现中,实现touchesEnded:withEvent:
方法并要求UITextView
作为第一响应者辞职。
#import "CustomView.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// Initialization code
}
return self;
}
- (void) awakeFromNib {
self.multipleTouchEnabled = YES;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touches began count %d, %@", [touches count], touches);
[textView resignFirstResponder];
[self.nextResponder touchesEnded:touches withEvent:event];
}
@end
添加完课程后,您需要保存所有更改,然后进入Interface Builder并单击您的视图。在Utility pabel中打开Identity检查器,并将 nib 文件中的视图类型更改为CustomView
,而不是默认的UIView
类。然后在Connections Inspector中,将textView
插座拖到UITextView
。执行此操作后,一旦重建应用程序,触摸活动UI元素外部现在将关闭键盘。但请注意,如果您继承的UIView
是其他UI元素的“后面”,则这些元素将在到达UIView层之前拦截触摸。因此,虽然这种解决方案很优雅,但它只能在某些情况下使用。在许多情况下,您必须采用强制方法将完成按钮添加到导航栏以关闭键盘。
答案 4 :(得分:0)
使用导航控制器并在完成后弹出视图?
例如,我使用这样的代码来滑动一个约框:[[self navigationController] presentModalViewController:modalViewController animated:YES];
然后当点击那个关于框的按钮时,我用它来摆脱它:
[self.navigationController dismissModalViewControllerAnimated:YES];
在我的情况下,about box占据整个屏幕,但我认为不需要这样做。
编辑:我想我可能误解了你的问题。如果你自己伪造整个键盘视图,那么我的代码就会出现问题。我认为辞职第一响应者是正确的方法,如果它是普通的键盘,并且工具栏添加在顶部。