2008-12-23 157 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圖層之前截取觸摸。所以雖然這個解決方案很優雅,但它只能在某些情況下使用。在很多情況下,您必須使用強力方法在導航欄中添加一個完成按鈕以關閉鍵盤。