【问题标题】:Custom drawRect: parameter自定义drawRect:参数
【发布时间】:2013-11-06 19:16:02
【问题描述】:

有没有办法在drawRect方法的自定义UIView类中添加第二个参数?

我目前正在使用 UIView 来绘制文本字符串,但文本本身是在 drawRect 方法中设置的。有没有办法以类似的方式传递文本变量

- (void) drawRect:(CGRect)rect(NSString *)text

如果没有,是否有任何替代解决方法?

谢谢

【问题讨论】:

    标签: ios drawrect


    【解决方案1】:

    您通常会为您的UIView 子类自定义@property

    @property (nonatomic, copy) NSString *text;
    

    您甚至可能有一个调用setNeedsDisplay 的自定义setter,这样当您设置text 属性时,视图的drawRect 将被调用,例如:

    - (void)setText:(NSString *)text
    {
        _text = [text copy];
        [self setNeedsDisplay];
    }
    

    然后,您的 drawRect 可以在需要引用 NSString 时引用 self.text

    【讨论】:

    • 嗨,Rob,您在 setter 中使用 _text,但在 drawRect 中您将其称为 self.text,我可以知道您为什么这样做吗?谢谢。
    • 完美,谢谢!我应该想到这一点。在将自定义视图添加为子视图之前,我使用了该属性,然后在视图控制器中设置了文本。
    • @Unheilig 关键的观察是你不应该使用self.text 来设置setter 中的属性,因为self.text = ... 转换为[self setText:...],你会得到无限递归。您永远不应该在访问器方法本身(或在initdealloc 方法中)使用访问器方法(setter 和getter)。在drawRect 中,您可以根据需要使用合成的ivar _text 来检索值(这是个人喜好问题),但我总是尽可能使用getter,因为它提供了最大的灵活性可以忽略不计的开销。
    • @Unheilig 高级内存管理编程指南Use Accessor Methods to Make Memory Management Easier部分概述了应该和不应该使用访问器方法的地方。
    • @Rob 很好的解释。是的,这敲响了警钟——递归。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多