2010-05-13 111 views
48

這可能是一個愚蠢的問題,但我無法在文檔中找到答案。彈出式鍵盤上的「完成」按鈕是否始終導致鍵盤消失?我看到了很多像這樣的代碼在網絡上:iPhone鍵盤,完成按鈕和resignFirstResponder

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

當我按下「完成」按鈕,彈出鍵盤下來,UITextField辭職第一響應。

我假設按下「完成」按鈕並未用於導致UITextFieldresignFirstResponder,但該行爲在某個時間發生了變化。

我調試的OS 3.0 - 3.1.3

+1

見https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iPhone101/Articles/05_ConfiguringView.html – 2012-02-09 22:13:38

+1

顯然,我不沒有足夠的代表只是給nevan king的回答添加評論,所以我會在這裏提到他的解決方案沒有必要讓這個類成爲UITextFieldDelegate。 UITextFieldDelegate協議只是定義了一些發送給委託的消息,詢問文本字段是否應該辭職,它是否會辭職等等......任何對象都可以以他完成的方式定義他們的方法與textFieldFinished。 – 2012-07-27 15:16:14

回答

89

我與只是一個的UITextField一個小的測試項目,這個代碼

#import <UIKit/UIKit.h> 
@interface TextFieldTestViewController : UIViewController 
<UITextFieldDelegate> 
{ 
    UITextField *textField; 
} 
@property (nonatomic, retain) IBOutlet UITextField *textField; 
@end 

#import "TextFieldTestViewController.h" 
@implementation TextFieldTestViewController 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self 
        action:@selector(textFieldFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
    [super viewDidLoad]; 
} 
- (IBAction)textFieldFinished:(id)sender 
{ 
    // [sender resignFirstResponder]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

文本字段是未修飾的UITextField拖到NIB,與連接的插座。
加載應用程序後,單擊文本字段將彈出鍵盤。按下「完成」按鈕會使文本字段失去焦點並在鍵盤上顯示動畫。請注意,圍繞網絡的建議總是使用[sender resignFirstResponder],但這種方式沒有它。爲完成按鈕

+0

嗯。什麼是addTarget:action:forControlEvents:for?是不是setDelegate:夠了?讓我一個人嘗試一下。 – bealex 2010-05-13 21:28:01

+0

是的,確切地說。如果你將刪除addTarget:...調用,一切都會好起來的。 – bealex 2010-05-13 21:39:12

+1

對於像我這樣的noobs來說,使用界面生成器來做到這一點的方法是將「退出時結束」中的+拖動到文件的所有者,然後將其分配給不執行任何操作的IBAction(textFieldFinished:(id)sender in this例)。上面的答案是正確的,只是想補充一下。 – 2011-09-14 17:29:03

6

從文檔(任何版本):

這是你的應用程序的 責任在自己選擇的時間以關閉鍵盤 。您的 可能會將鍵盤響應 解除爲特定的用戶操作,例如 用戶輕擊用戶界面中的特定按鈕。當用戶 按下 鍵盤本身的「返回」鍵時,您可能還會將 配置爲 關閉鍵盤。要解僱 鍵盤,請將 resignFirstResponder消息發送到 文本字段,該字段是當前響應者的第一個 響應者。這樣做會導致文本 字段對象結束當前 編輯會話(與代表 對象的同意)並隱藏 鍵盤。

所以,你必須以某種方式發送resignFirstResponder。但在處理textFieldShouldReturn:消息時,textfield有可能失去另一種焦點。這也會導致鍵盤消失。

+0

感謝您的回答。我找到了導致'UITextField'辭職的第一響應者。我有一個電話'\t [textField addTarget:self action:@selector(textFieldDone :) forControlEvents:UIControlEventEditingDidEndOnExit]'。奇怪的是,'textFieldDone:'方法是空的(我刪除了'resignFirstResponder'調用)。所以我仍然不知道爲什麼鍵盤消失。 – 2010-05-13 18:31:57

+0

也許你隱式地將焦點移動到另一個組件?例如通過改變表格或標籤中的某個值? – bealex 2010-05-13 19:35:15

+0

我不這麼認爲,還有其他事情正在發生。我創建了一個小型項目(貼出下面的代碼),它給出了相同的行爲。不太確定它爲什麼會發生。 – 2010-05-13 21:12:38

2

一行代碼: -

[yourTextField setReturnKeyType:UIReturnKeyDone]; 

而上的TextField的添加的valueChanged操作方法和添加此LINE-

[yourTextField resignFirstResponder]; 
13

在Xcode中5。1

啓用完成按鈕

  • 在屬性檢查器的UITextField在故事板中找到字段「返回鍵」,然後選擇「完成」完成按下

    隱藏鍵盤

  • 在Storyboard中讓您的ViewController成爲UITextField的代表
  • 此方法添加到您的ViewController

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