2012-02-09 19 views
4

私は次のように私は、テキストフィールドに割り当てるUIViewサブクラスがあります。iOSのカスタムキーボード:UITextFieldにアクセスするにはどうすればよいですか?

self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 

を、これは(すなわち、キーボードが起動します)動作します。 HexKeyboardインスタンスはtextFieldについてどのように知っていますか?

[もちろん、私はこれを達成(およびdelegateそれを呼び出す)するHexKeyboardにプロパティを追加することができますが、私は、このための組み込みのメカニズムがあります理解...]

答えて

1

他の回答者が指摘しているように、このための組み込みのメカニズムはないようです。 Nickの言うとおり、複雑なデリゲートパターンは必要ありません。むしろ、デリゲートパターンを使用しますが、デリゲートクラスは無料で入手できます。この場合は、UITextInputプロトコルです。

は、だからあなたのキーボードは、おそらくこのようになります(とNIBを持っている)を使用すると、キーボードコントローラを作成する場合、あなたはそれにUITextInputコンフォーマーを割り当てる

@interface ViewController : UIViewController 

// use assign if < iOS 5 
@property (nonatomic, weak) IBOutlet id <UITextInput> *delegate; 

@end 

ので、このような何か:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    HexKeyboardController *keyboardController = [[HexKeyboardController alloc] initWithNibName:@"HexKeyboardController" bundle:nil]; 
    self.textField.inputView = keyboardController.view; 
    keyboardController.delegate = self.textField; 

} 

しかし、私は、このキーボードを一度だけ定義して、それを召喚したUITextInputオブジェクトを "自動的に知る"ようにキーボードを得る方法がなければならないと考えました。しかし、私は役に立たないように見てきました...ビューの階層を自分でトロールしたり、代理人をリストに残さない限り(保持ループを引き起こす)、firstResponderが誰なのかわかりません。 さらに、textFieldが解放されると、HexKeyboardControllerもアンロードされるので、これはそれほど悪くありません。

+0

私は "iOS5の場合は割当を使用する"コメントを取得しません - iOS5は保持を使用する場合、iOS5は保持サイクルからあなたを保護しません.iOS4の下の割当はiOS5の下での保持と同等ではありません。 –

+0

こんにちは@NickLockwood、私は私の編集で24秒でパンチにあなたを打つ:)真剣に、私の謝罪、私のコードが間違っていた。 –

+1

Heh、damn iPhoneキーボード - コメントを入力するのが遅すぎる! –

0

私はそこにあると信じていけませんこのためのメカニズムが組み込まれているので、おそらくデリゲートを16進キーボードに入れ、 "キーストローク"を受け取ってテキストフィールドに追加するか、何をする必要があるかを入力してください。

3

これには複雑なデリゲートパターンが本当に必要です。ちょうどあなたのHexKeyboardクラス上のタイプのUITextFieldのプロパティを作成し、あなたが保持ループを得ることはありませんので、それunsafe_unretained参照します:次に

@interface HexKeyboard 

@property (nonatomic, unsafe_unretained) UITextField *textField; 

@end 

あなたinputViewを設定するときに設定します。

self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
self.textField.inputView.textField = self.textField; 
+0

弱いのではなく 'unsafe_unretained'なぜですか? –

+0

弱いのはiOS5のみです。 iOS5のみをサポートする予定の場合は、代わりにweakを使用してください。 iOS4をサポートする必要がある場合は、unsafe_unretainedを使用してください。 –

+1

ありがとうございます。 iOS4でも動作する 'assign'に勝る点は何ですか? –

関連する問題