我想知道如何使用委托MyViewController
从一个名为的类发送时钟消息,MotionListener
但在将 Apple 的解释target-action
转换为可行的命令时遇到了麻烦。
Target-action 是一种设计模式,其中一个对象拥有在事件发生时向另一个对象发送消息所需的信息。存储的信息由两项数据组成:一个动作选择器,它标识要调用的方法,一个目标,它是接收消息的对象。] 1
我可以毫不费力地应用示例(下)中的解释(上),使用委托向每当按下它时调用的目标发送消息myButton
fromButtonInSubview
[mySyncButton addTarget:self.delegate
action:@selector(fromSyncButtonInSubview:)
forControlEvents:UIControlEventTouchUpInside];
我假设为了发送不是来自 a 的信号,UIButton,
我仍然需要声明协议[a],给它一个属性[c]并包含一个初始化方法[b]
[一个]
@protocol SyncDelegate <NSObject>
-(void)fromSync:(int)clock;
@end
@interface MotionListener : NSObject {
}
[乙]
- (id) initMotionSensingWith:(float)updateInterval;
[C]
@property (assign) id<SyncDelegate> delegate;
@end
并在接口[d]中声明协议并在实现中添加目标方法[e]
[d]
@interface PlayViewController : UIViewController <SyncDelegate>
[e]
- (void)fromSync:(int)clock
{
NSLog(@"tick"); // do stuff and show
}
然后在MyViewController,
import MotionListener
[f]中,在实现[g]中声明它并定义委托[h]
[F]
#import "MotionListener.h"
[G]
MotionListener *sync = [[MotionListener alloc] initMotionSensingWith:(float)updateInterval];
[H]
sync.delegate = self;
但是,尽管重新阅读了上面引用的解释并且在几次尝试失败后,我还没有编写一个命令来发送同步信号MotionListener
,MyViewController.
我知道它将具有示例(上图)addTarget:self.delegate
中action:@selector(fromSync:)
的效果。在有人建议我之前,我已经将它的时钟频率设为 50 Hz,而同步信号为 1 HzUIButton
NSTimer selector,
例如
[NSTimer scheduledTimerWithTimeInterval:0.02; // 50 Hz
target:self
selector:@selector(motionRefresh:)
userInfo:nil
repeats:YES];
- (void)motionRefresh:(id)sender
{
count = (count + 1) % 50; // every 1 second
if (count == 0 )
{
// send the sync message here
// EDIT
NSLog(@"sending %i", count);
[self.delegate fromSync:(int)count];
}
}
所以我的问题是:使用委托我如何在每次count
轮流时发送同步消息0
?答案可能简单得令人尴尬,但如果你能帮忙,我可以穿上它。谢谢。