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