将自定义协议添加到UITextField

时间:2015-06-06 14:24:54

标签: ios swift protocols

我有一些用于身份验证和注册视图的表单,我希望这些表单中的所有UITextField都有一个UIButton作为附件视图,就在键盘上方。我想有可能为这个按钮设置标题和动作

因为我希望所有这些文本字段都有一个,每个都有一个标题和一个动作,为了避免冗余,我想到了一个协议。 我想要扩展自定义协议,例如UITextFieldAccessoryViewDelegate,并符合以下某些功能: -buttonAccessoryView标题... - >串 -didClickOnAccessoryViewButton .. - > ()

我的思绪已经闭上了。有人可以给我一些想法来做我想做的事吗?

2 个答案:

答案 0 :(得分:0)

您可以使用associated objects来解决此问题。这允许您添加属性及其合成的getter / setter。

@interface UITextField(AccessoryButton)

@property(readwrite, strong, nonatomic) UIButton *accessoryButton;

@end

#import<objc/runtime.h>
@implementation UITextField(AccessoryButton)

-(UIButton*) accessoryButton
{
    objc_getAssociatedObject(self, @selector(accessoryButton));
}

-(void) setAccessoryButton:(UIButton *)accessoryButton
{
    objc_setAssociatedObject(self, @selector(accessoryButton), accessoryButton, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

将此类别包含在需要文本字段的UIButton的表单中。然后像往常一样为UIButton分配动作和标题。

答案 1 :(得分:0)

考虑到你想做的一切,我认为你最好使用UITextField的子类而不是扩展名。

扩展不能将实例变量添加到它们扩展的对象中,但是子类可以。正如lead_the_zeppelin在他的回答中指出的那样,你可以使用相关的对象来模拟用扩展名添加实例变量,但是当子类为你提供你想要的一切时,似乎你不必复杂化它。