你如何创建UITextField的子类?

时间:2014-07-08 02:47:44

标签: ios cocoa-touch ios7 uitextfield

我计划将UITextField子类化,以便我可以全局自定义应用程序中文本字段的外观。基于我们的模型中的设计,文本字段应该有一个绿色边框,我已经为我的一个文本字段做了。 (来源:https://stackoverflow.com/a/5749376/334545

我还更改了占位符颜色,如下所示:https://stackoverflow.com/a/19852763/334545

但所有这些仅适用于一个文本字段。我希望我的所有其他文本域都有这个,所以我尝试通过创建一个我尝试使用的新uitextfield类进行子类化。我将上述方法添加到MYUITextField.m的initWithFrame方法中:

- (id)initWithFrame:(CGRect)frame
{
   self = [super initWithFrame:frame];
   if (self) {
       // Initialization code
       UIColor *greenColor = [UIColor colorWithRed:122.0/255.0 green:168.0/255.0 blue:73.0/255.0 alpha:1.0];
       UIColor *greyColor = [UIColor colorWithRed:87.0/255.0 green:87.0/255.0 blue:87.0/255.0 alpha:1.0];

       self.layer.borderColor=[greenColor CGColor];
       self.layer.borderWidth= 1.0f;

       self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSForegroundColorAttributeName: greyColor}];

   }
   return self;
}

我应该只更改drawRect方法吗?应用程序会因此而变慢吗?

2 个答案:

答案 0 :(得分:2)

使用NIB时,您需要告诉资源您的自定义类。

自定义类设置为 MYUITextField ,如下所示:

  1. 选择您的TextField
  2. Xcode>查看>公用事业>显示Identity Inspector
  3. 在“自定义类”下拉列表中,选择您的自定义类
  4. 如果使用资源,请覆盖-awakeFromNib而不是-initWithFrame:

    -(void)awakeFromNib
    {
        [super awakeFromNib];
        self.layer.borderColor=[[UIColor greenColor] CGColor];
        self.layer.borderWidth= 1.0f;
        self.attributedPlaceholder = [[NSAttributedString alloc]
                                      initWithString:@""
                                          attributes:@{NSForegroundColorAttributeName:
                                                       [UIColor greyColor]}];
    }
    

    有关详细信息,请参阅init and awakeFromNib

答案 1 :(得分:1)

我相信你这样做会更有效率。 -drawRect:可以多次调用。通过设置-initWithFrame:中的值,您只能确保只设置一次。

话虽如此,我很确定性能差异可以忽略不计。

编辑:如果你以编程方式做事,那就是这样。如果使用笔尖或故事板,请使用方法-awakeFromNib