【问题标题】:How do you make a subclass of UITextField?你如何创建 UITextField 的子类?
【发布时间】:2014-08-28 15:54:24
【问题描述】:

我计划子类化 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 方法吗?应用会因此变慢吗?

【问题讨论】:

  • 您是否担心覆盖 drawrect 对速度的影响?那么不太可能。但一般来说,覆盖 drawRect 是 Cocoa 控件的最后手段。我建议在更改绘图机制之前修改属性。

标签: ios cocoa-touch ios7 uitextfield


【解决方案1】:

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

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

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

【讨论】:

  • 我已经这样做了,但遗憾的是 textfilds 并没有反映我所做的更改。我需要做其他事情吗?在我的视图控制器中,我将自定义类设置为“MYUITextField”,也在 MyViewController.m 文件中。 (抱歉,iOS 新手)
  • 啊,没看到你在用笔尖。
【解决方案2】:

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

将 Custom Class 设置为 MYUITextField,如下所示:

  1. 选择您的文本字段
  2. Xcode > 视图 > 实用工具 > 显示身份检查器
  3. 在自定义类下拉列表中,选择您的自定义类

如果使用资源,请覆盖 -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。

【讨论】:

  • 我也这样做了,但没有显示更改(边框颜色、占位符颜色)。我是否需要做一些特别的事情,比如调用重绘之类的?
  • 是的。如果使用资源,覆盖 -awakeFromNib。
  • 谢谢!正是我需要的!
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 2012-02-19
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多