iOS上的自定义键盘:如何访问UITextField?

时间:2012-02-09 15:42:25

标签: objective-c ios

我有一个UIView子类,我将其分配给文本字段,如下所示:

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

这是有效的(即键盘出现)。 但是,HexKeyboard实例应如何了解textField

[当然我可以在HexKeyboard添加一个属性来实现这一点(并称之为delegate),但我认为这里有一个内置机制......]

3 个答案:

答案 0 :(得分:3)

你真的不需要复杂的委托模式。只需在HexKeyboard类上创建一个UITextField类型的属性,并使其成为unsafe_unretained引用,这样就不会得到一个retain循环:

@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;

答案 1 :(得分:1)

正如其他回答者所指出的那样,似乎没有内置机制。正如Nick所说,你不需要复杂的委托模式。或者更确切地说,您使用委托模式,但您可以免费获得委托类。在这种情况下,它是UITextInput协议。

所以你的键盘可能看起来像这样(并且有一个NIB)

@interface ViewController : UIViewController

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

@end

创建键盘控制器时,为其分配UITextInput构造函数,如下所示:

- (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也会卸载。

答案 2 :(得分:0)

我不相信有一个内置的机制,你可能希望在十六进制键盘中的一个委托将从它接收“击键”,然后将它附加到文本字段,或者你需要做什么..