Dar*_*lay 4 design-patterns objective-c ios
我正在为大学项目开发健身计时器应用程序.我的主计时器类是NSObject的子类.我希望其他对象能够注册定时器事件,例如定时器暂停,定时器完成等.我认为目标动作模式最适合这个,但我该如何实现呢?我需要能够为每个特定动作添加多个目标,就像UIButton这样做.
任何帮助表示赞赏.
这是添加多个目标的简单方法.显然,你想要构建一些错误检查并使其更灵活,但希望你能得到这样的想法:
编写一个允许其他对象将自己添加为目标的方法:
- (void) addTarget:(NSObject *)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents {
if (controlEvents == UIControlEventValueChanged) {
NSArray *targetAndAction = @[target, [NSValue valueWithPointer:action]];
[valueChangedArray addObject:targetAndAction]; // valueChangedArray is a NSMutableArray, already initialized
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不想使用UIControlEvents,则不必使用NSArrays来存储所有内容.这里重要的是你要挂在目标上,并将选择器存储为NSValue对象.
当发生某些事情时,在对象上执行选择器:
- (void) somethingHappened {
// something happened, inform the objects who registered
for (NSArray *targetAndAction in valueChangedArray) {
NSObject *target = targetAndAction[0];
NSValue *actionValue = targetAndAction[1];
SEL action = [actionValue pointerValue];
[target performSelector:action];
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果选择器保留任何对象,您可能会遇到内存泄漏(Xcode会警告您这一点).只要您的选择器没有返回它们创建/复制的对象,您应该没问题.有关performSelector潜在泄漏的更全面讨论,请参见:performSelector可能导致泄漏,因为其选择器未知.
| 归档时间: |
|
| 查看次数: |
949 次 |
| 最近记录: |