【发布时间】:2013-03-21 08:02:22
【问题描述】:
我有一个包含许多属性的类。设置每个属性后,我需要更新应用程序的 UI。设置器看起来像这样:
@synthesize trackHighlightColour = _trackHighlightColour;
- (void)setTrackHighlightColour:(UIColor *)trackHighlightColour
{
_trackHighlightColour = trackHighlightColour;
[self updateUI];
}
我不想输入 10 次,而是使用宏。这是我目前所拥有的:
#if !defined(PROPERTY_SETTER)
#define PROPERTY_SETTER(PROPERTY_NAME, UPPER_PROPERTY_NAME) @synthesize (PROPERTY_NAME) = _(PROPERTY_NAME);\
\
- (void)set(UPPER_PROPERTY_NAME):(UIColor *)(PROPERTY_NAME)\
{\
_(PROPERTY_NAME) = (PROPERTY_NAME);\
[self updateUI];\
}
#endif
不幸的是,这有一些问题。
- (次要)需要用两个大小写重复属性名称
-
编译器不允许我传递属性名称,而是必须将其作为字符串传递:
@implementation FooClass
PROPERTY_SETTER(@"trackHighlightColour", "TrackHighlightColour");
@结束
放弃这种技术感觉太接近了。有人有什么建议吗?
【问题讨论】:
-
这看起来是一个使用 Key Value Observation 而不是宏和在每个 setter 中直接更新 UI 的好地方。你考虑过吗?大写/小写问题将是宏中难以解决的问题。
-
@gaige 从这个问题stackoverflow.com/questions/5893392/…看来,用于观察“自我”的 KVO 似乎不是一个优雅的解决方案。
-
这当然不是我的经验。当然,无论如何模型都不应该更新 GUI(控制器应该观察模型类并更新 GUI),但是观察 self 很容易工作并将 KVO 信息传递给 super 是微不足道的。唯一的问题是从你不知道他们是否已经在做 KVO 的类继承,这应该不是问题。
标签: ios objective-c xcode macros