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

Objective c iOS上的自定义键盘:如何访问UITextField?,objective-c,ios,Objective C,Ios,我有一个UIView子类,分配给文本字段,如下所示: self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 这样就行了(比如,键盘打开了)但是,HexKeyboard实例如何知道textField? [当然我可以为六角键盘添加一个属性来实现这一点(并称之为委托),但我认为这有一个内置机制…]我不相信有一个内置机制可以实现这一点,你可能希望在六角键盘中有一个委托,它将接

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

self.textField.inputView = [[HexKeyboard alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
这样就行了(比如,键盘打开了)但是,
HexKeyboard
实例如何知道
textField


[当然我可以为
六角键盘添加一个属性来实现这一点(并称之为
委托
),但我认为这有一个内置机制…]

我不相信有一个内置机制可以实现这一点,你可能希望在六角键盘中有一个委托,它将接收“击键”然后将其附加到文本字段,或者您需要执行的任何操作。

为此,您实际上不需要复杂的委托模式。只需在HexKeyboard类上创建UITextField类型的属性,并将其设置为不安全的\u未恢复引用,这样就不会得到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;

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

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


然而,我想,必须有一种方法来定义这个键盘一次,让键盘“自动知道”调用它的对象是谁。但我四处张望都没用。。。除非您自己拖动视图层次结构或将代理保留在列表中(这将导致保留循环),否则无法确定第一响应者是谁另外,这还不算太糟,因为当解除分配
文本字段时,HexKeyboardController也将卸载。

为什么
不安全\u未恢复而不是弱?弱仅是iOS5。如果您只计划支持iOS5,请改用弱。如果您需要支持iOS4,请使用unretained。谢谢。与同样适用于iOS4的
assign
相比,assign有什么优势?如果使用ARC,则assign不能用于对象属性。如果您不使用ARC,则使用assign或unsafe_Unrepaired也没什么区别。我敢肯定,当我尝试它时,它会给我一个编译器警告,如果您运行ARC转换工具,它会将assign更改为unsafe_Unrepaired。尽管这也意味着它将是一个协议而不是一个具体的类,但在另一方面可能会产生误导。我没有得到“use assign if@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;

}