将实例变量的setter/getters传递给一个类

问题描述:

我正在创建一个UIView子类(我称之为MarqueeLabel),该子类在UILabel文本太长时间内以字幕方式动画显示子视图UILabel ivar包含的视图。将实例变量的setter/getters传递给一个类

我希望有一个干净的执行,而无需编写我MarqueeLabel类只是方法来设置/检索所有标准的UILabel(文本,字体,颜色等)实例的UILabel伊娃的变量。我找到了一种方法来处理邮件转发 - 发送到MarqueeLabel的所有无法识别的方法都传递给UILabel ivar。在我的情况下,MarqueeLabel无法识别的方法是通常与UILabel一起使用的方法。

有一些问题,这种方法虽然:
你必须使用[marqueeLabel setText:@"Label here"],而不是marqueeLabel.text
2.编译器给出了上面这行的警告,这是因为:

'MarqueeLabel'可能不会响应'-setText:'

我想知道该忽略但会惹恼其他人。

为了避免这些问题,有没有什么办法可以“提出”一个伊娃的方法,以便他们在使用这个类的时候可以访问某些东西,同时仍然作用于伊娃尔对象?

谢谢!

注意:我设置它的方式可能不是最好的方法。也许继承UILabel的子类或类会更好,但我无法理解动画+裁剪(当文本滚动离开包含UIView并消失时)可以使用这些方法完成。

注2:我知道你可以使用marqueeLabel.subLabel.text其中subLabel是子视图UILabel。这可能是我采取的方向,但也可以看看是否有更好的解决方案!

对于属性,您可以在接口中定义一个属性,并在实现中使用@dynamic,以便您不必创建存根实现。确保您也覆盖valueForUndefinedKey:setValue:forUndefinedKey:并转发到您的标签。

对于不属于属性一部分的任何方法,可以使用类别声明方法而不实现它。这将摆脱警告,但仍然使用内置转发。

//MarqueeLabel.h 
#import <UIKit/UIKit.h> 
@interface MarqueeLabel : UIView {} 
@property (nonatomic, copy) NSString *text; 
@end 
@interface MarqueeLabel (UILabelWrapper) 
- (void)methodToOverride; 
@end 

//MarqueeLabel.m 
#import "MarqueeLabel.h" 
@implementation MarqueeLabel 
@dynamic text; 
- (id)valueForUndefinedKey:(NSString *)key { 
    return [theLabel valueForKey:key]; 
} 
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { 
    [theLabel setValue:value forKey:key]; 
} 
@end 
+0

完全按照我的想法工作,谢谢!我在想``动态`将需要以某种方式使用,但我没有遇到forUndefinedKey方法,只有forwardInvocation。我想可能你的意思是`[theLabel setValue:value forKey:key];`尽管如此。 – Chuck 2011-02-04 04:56:58