15

我正在尝试重新创建类似于 Safari 中使用的弹出式键盘的东西。

替代文字

我可以通过在我的视图和适当的按钮上放置一个工具栏来直观地重现它,但是一旦用户触摸了完成按钮,我想不出任何方法来关闭键盘。

4

5 回答 5

50

您需要记住几件事。开发人员忘记设置的编号 #1 部分是 textField 的委托

如果您使用 Interface Builder,您必须记住您需要将 textField 的委托设置为文件 Owner。

如果您没有使用 Interface Builder,请确保将文本字段的委托设置为 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 设置了委托,为接口实现 UITextFieldDelegate,您添加 textFieldShouldReturn 方法并调用您设置的 resignFirstResponder。

于 2009-07-26T18:25:08.150 回答
26

你有没有尝试过:

[viewReceivingKeys resignFirstResponder];

viewReceivingKeys接收文本输入的 UIView在哪里?

于 2008-12-23T19:29:12.690 回答
6

如果您在 Interface Builder 中构建自己的视图,请将视图控制器设置为文本字段的委托,并在视图控制器中实现 textFieldShouldReturn: from UITextFieldDelegate。

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    NSLog(@"%@ textFieldShouldReturn", [self class]);
    [theTextField resignFirstResponder];
    // do stuff with the text
    NSLog(@"text = %@", [theTextField text]);
    return YES;
}

UITextFieldDelegate textFieldShouldReturn:在 iphone 可可文档中

于 2008-12-23T20:58:36.363 回答
2

如果您正在谈论从 aUITextField而不是 a解除键盘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;
}

但是,如果您使用的是 aUITextView那么事情会更复杂一些。该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 选项卡中打开身份检查器,并将nib文件中的视图类型更改为您的CustomView而不是默认UIView类。然后在 Connections Inspector 中,将textView插座拖到UITextView. 这样做之后,一旦你重建你的应用程序,在活动 UI 元素之外的触摸现在将关闭键盘。但是请注意,如果UIView您的子类化位于其他 UI 元素“之后”,这些元素将在触摸到达 UIView 层之前拦截触摸。因此,虽然这个解决方案很优雅,但它只能在某些情况下使用。在许多情况下,您将不得不求助于添加导航栏上的完成按钮以关闭键盘。

于 2012-02-21T10:49:35.383 回答
0

使用导航控制器并在完成后弹出视图?

例如,我使用这样的代码来滑动一个关于框:

[[self navigationController] presentModalViewController:modalViewController animated:YES];

然后当单击该关于框中的按钮时,我使用它来摆脱它:

[self.navigationController dismissModalViewControllerAnimated:YES];

在我的情况下,关于框占据了整个屏幕,但我认为它不必为此工作。

编辑:我想我可能误解了你的问题。如果您自己伪造整个键盘视图,则与我的代码类似。我认为,如果它是在顶部添加工具栏的普通键盘,那么辞职第一响应者是正确的方法。

于 2008-12-23T19:31:08.880 回答