2008-12-23 159 views
15

我想重新创建类似于safari中使用的弹出式键盘的东西。关闭iphone键盘

alt text

我能超过我的观点和适当的按钮placeing工具栏在视觉上重现它,但是我不能想出什么办法来消除键盘一旦用户触摸完成按钮。

回答

26

你试过:

[viewReceivingKeys resignFirstResponder]; 

其中viewReceivingKeys是接收文本输入的UIView?

+0

这是我想要的兴奋。谢谢。 – Lounges 2008-12-23 21:25:56

0

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

例如,我用这样的代码到约盒滑入:

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

,然后当在关于对话框单击该按钮时,我用它来摆脱它:

[self.navigationController dismissModalViewControllerAnimated:YES]; 

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

编辑:我想我可能误解了你的问题。如果你自己伪造整个键盘视图,那么我的代码就会出现这种情况。我认为辞职的第一响应者是正确的方式来做到这一点,如果它是你的工具栏添加在顶部的普通键盘。

6

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

- (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

49

有几个你需要记住的东西。开发人员忘记设置的号码#1部分是textField的代表

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

如果您未使用Interface Builder,请确保将文本字段的委托设置为self。我还包括returnType。例如,如果文本框被称为gameField:

gameField.delegate = self; 
gameField.returnKeyType = UIReturnKeyDone; 

您还必须实现UITextFieldDelegate您的视图控制器。

@interface YourViewController : UIViewController <UITextFieldDelegate> 

最后,你需要使用textFieldShouldReturn方法,并呼吁[文本字段resignFirstResponder]所以你只需要有这个设置一次

-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 

您所有的文本框将使用同样的方法。只要将代理设置为textField,将为接口实现UITextFieldDelegate,则添加textFieldShouldReturn方法并调用您设置的resignFirstResponder。

+0

我想你的意思是gameField.returnKeyType = UIReturnKeyDone; – 2010-11-11 21:35:48

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 inspector并将笔尖文件中的视图类型更改为您的CustomView而不是默认的UIView类。然后在Connections Inspector中,将textView插座拖动到UITextView。这样做后,一旦你重建你的应用程序,触及活跃的用户界面元素现在将关闭键盘。但是,请注意,如果您正在进行子类化的UIView位于其他UI元素“后面”,则这些元素将在到达UIView图层之前截取触摸。所以虽然这个解决方案很优雅,但它只能在某些情况下使用。在很多情况下,您必须使用强力方法在导航栏中添加一个完成按钮以关闭键盘。