web-dev-qa-db-ja.com

UITextFieldのデリゲートが機能しない...リターンボタンが応答しない

私はxcodeとobjective-cを使い始めて、いくつかの非常に基本的なアプリを実行しましたが、私が問題にしているのはこれが非常に基本的なことです。キーボードを隠していないキーボードの戻りボタン。

私は解決策をインターネットで検索しましたが、デリゲートをファイルの所有者に接続して関数を追加するだけで、機能するはずです。それを実行しても何も機能していません。

[OK]ボタンがあり、それは機能しています。また、画面上の空き領域をクリックしても機能しています。戻るボタンだけです。

私はシミュレーターを使用していますが、iPhoneではまだテストしていません。 (4.2シミュレーターではxcode 3.2.5 64ビット)。

これは、デリゲートをすべてのtextFiledに接続する必要があるコード行です。 1. YESNOの両方を返そうとしましたが、機能しませんでした。 2. textFieldの特定のオブジェクト名とこの一般的な方法の両方を試しましたが、機能しませんでした。

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

:基本的なView Controller接続->接続->アウトレットには、:デリゲート-ファイルの所有者があります。アウトレットを参照するファイルの所有者には、デリゲート-ラウンドスタイルのテキスト....があります。

編集-前に言及するのを忘れました、チェックしましたが、メソッドが呼び出されていません!!!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;

}

それを実現するにはどうすればよいですか?だから人々はデリゲートを接続すると言いますが、私の場合は接続されていて関数をトリガーしていません...それは一種のばかげた質問ですが、私のような初心者にとっては解決策は明らかではありません...

OK、別の編集-私のすべてのコードで:何をすべきか理解できません....これは:basicViewController.h

#import <UIKit/UIKit.h>

@interface basicViewController : <#superclass#> <UITextFieldDelegate>

@interface basicViewController : UIViewController <UITextFieldDelegate> {
//every object that we want to interact with (like text field or lable) is call an   outlet!!!!
//here we define the outlets for our program
IBOutlet UITextField *txtName;
IBOutlet UILabel *lblMessage;
 }

//here are the getters and setter for our outlets
@property (nonatomic, retain) IBOutlet UITextField *txtName;
@property (nonatomic, retain) IBOutlet UILabel *lblMessage;

//method decleration for the OK button action
- (IBAction) doSomething;



//method for hiding the keyboard when clicking on empty area in the app
   //we will put an invisible button on all area and clicking on it will make keyboard disapear
   - (IBAction) makeKeyboardGoAway;

   @end

これは basicViewController.m

 #import "basicViewController.h"

 @implementation basicViewController

 //synthesizeing the objects that we made' this will create the getter and setters automaticly
 @synthesize txtName;
 @synthesize lblMessage;

 - (IBAction) doSomething{
// makeing keyboard disapear when pressing ok button (doing that form the text field)
//when pressing the OK button, the keyboard will disapear and when clicking in the text field it will show again
[txtName resignFirstResponder];



NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@",txtName.text];

//the objective-c way for setting the test in the text field
[lblMessage setText:msg];   
//the regular object oriented way
//lblMessage.text = msg;
[msg  release];
 }    

 - (IBAction) makeKeyboardGoAway{
[txtName resignFirstResponder];
 } 

 //when clicking the return button in the keybaord
 - (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;
 }


 - (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
 }

 - (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
 }


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

 @end

多分今私はもっとはっきりしています、申し訳ありませんが私は前にそれをしませんでした。誰かが私が間違っていることを知っていますか?それはかなりまっすぐ進むはずです.....

編集-すべての要素の画像を追加します。それが私を助けるのに役立つことを願っています:-) alt text

助けようとしているすべての人に10倍たくさん....私はこのフレームワークが本当に好きです、それはc ++とJava、pythonと他の多くの後にとても素晴らしいです...そして私は働いています本で、しかしそれはios 3.1のためです、多分それは問題です...。

13
Erez

まず、メソッドの先頭にNSLogステートメントまたはブレークポイントを追加して、textFieldShouldReturn:が実際に呼び出されているかどうかを確認する必要があります。

それが邪魔にならないようになったら、ViewControllerがインターフェイスファイルの<UITextFieldDelegate>プロトコルに準拠していることを手動で宣言してみてください。

@interface YourClass : ... <UITextFieldDelegate>

また、UITextFieldのプロパティとアウトレットを宣言し、IBで適切な接続を確立し、selfUITextFieldデリゲートとして手動で宣言します。

self.yourUITextFieldObject.delegate = self;

それが完了したら、上記のメソッドが呼び出されているかどうかを確認し、YESを返すことを確認してください。

31
Rog

に1行書くだけです

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
}

はいを返す前に;最終バージョンは以下のようになります。

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

-(void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"%@",textField.text);
}
6
user1229932

テキストフィールドのデリゲートをファイル所有者に割り当てる必要があります。テキストフィールドはメッセージを送信していますが、それに応答するデリゲートがありません。

これを行うには、InterfaceBuilderを使用します。このメソッドを実装する必要があります。

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

Rogが言ったように、テキストフィールドをデリゲートに登録することを忘れないでください。彼が言ったように手動でこれを行うことができますが、ストーリーボードでは、すべてのテキストフィールドからビューコントローラーへのドラッグを制御してデリゲートを登録できます(デリゲートを選択)。登録されているテキストフィールドのみが、これらすべてのメソッドを使用できます。

したがって、この行は重要です。

self.yourUITextFieldObject.delegate = self;

または、最近ではさらに簡単にストーリーボードを使用することもできます。

enter image description here

2
Jordy

にログを置きます

- (IBAction) makeKeyboardGoAway

関数。画面をタップするたびにこの方法だと思います。その場合、タッチイベントをテキストフィールドに送信する必要があります。これがどのように行われるかはわかりませんが、それでうまくいくはずです。それ以外の場合は、ビュー全体のタップ(クリック)を処理するを削除して、実行していることを実行してみてください。

1
Nareshkumar

テキストフィールドはサブビューにありますか?この場合、textfieldにFileOwnerが委任されていることを確認してください。

1
doxsi

おそらく問題は、実行中のアプリケーションの実際のView Controllerが「basicViewController」ではなく、UITextFieldDelegateプロトコルを実装していないUIViewControllerであるということです。

FilesOwnerとしてクラス "basicViewController"を選択することにより、インターフェイスビルダーで行ったことは、実行中のアプリケーションのFilesOwnerオブジェクトがbasicViewController型であるように宣言するだけです。実際のオブジェクトはこの宣言によってnotインスタンス化され、あなたの場合はxib/nibにはありません。

コードの他の部分は、実際にView Controllerオブジェクトをインスタンス化し、xib/nibファイルをロードします。その場所では、あなたのコードはUIViewControllerをインスタンス化しており(通常は自動生成されたコードによって)、basicViewControllerのインスタンスではないと思います。そこでクラスを変更するだけです。

さらに、このエラーは、他のカスタムビューをインスタンス化してロードするように構成されている(必要な)InterfaceBuilderでUINavigationControllerまたはUITabBarControllerを使用している場合によく発生します。このような高レベルのコントローラーを使用する場合は、xib/nibからビューをロードするときに、UIViewControllerではなくbasicViewControllerを使用するように実際に構成されていることを再確認してください。

うまくいけば、それは問題を解決します!

1
Sascha

これを試してみませんか。

@interface ClassName : SuperClass < UITextFieldDelegate >
0
Bluely

このように使用してください...

textfield.delegate=self;

.hクラスでUITextFieldDelegateを使用します

私も同じ問題を抱えていました。 UIViewControllerとUITextFieldDelegateを拡張するUITextFieldDelegate専用の個別クラスMyTextFieldDelegateがあります。 textFieldShouldReturn(...)と他のいくつかの関数が含まれています。現在のUIViewController(たとえば、MyViewController)のViewDidLoad(...)関数で、次のように記述しました。

let myTextfieldDelegateLowLimit = MyTextFieldDelegate()
textfieldLowLimitTo.delegate = myTextfieldDelegateLowLimit

そして、それは私にとってはうまくいきませんでした。しかし、myTextfieldDelegateLowLimitをグローバルに宣言すると、機能しました。

0
Zhebzhik Babich

テキストフィールドがどのビューにあるかさえわからない場合は、次を使用していつでもキーボードを閉じることができます。

Objective-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) 
                                           to:nil 
                                         from:nil 
                                     forEvent:nil];

スイフト:

UIApplication.sharedApplication().sendAction("resignFirstResponder", 
                                           to:nil, 
                                         from:nil, 
                                     forEvent:nil)
0
OhadM