0

我想知道如何使用委托MyViewController从一个名为的类发送时钟消息,MotionListener但在将 Apple 的解释target-action转换为可行的命令时遇到了麻烦。

Target-action 是一种设计模式,其中一个对象拥有在事件发生时向另一个对象发送消息所需的信息。存储的信息由两项数据组成:一个动作选择器,它标识要调用的方法,一个目标,它是接收消息的对象。] 1

我可以毫不费力地应用示例(下)中的解释(上),使用委托向每当按下它时调用的目标发送消息myButtonfromButtonInSubview

        [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;

但是,尽管重新阅读了上面引用的解释并且在几次尝试失败后,我还没有编写一个命令来发送同步信号MotionListenerMyViewController.我知道它将具有示例(上图)addTarget:self.delegateaction:@selector(fromSync:)的效果。在有人建议我之前,我已经将它的时钟频率设为 50 Hz,而同步信号为 1 HzUIButtonNSTimer 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?答案可能简单得令人尴尬,但如果你能帮忙,我可以穿上它。谢谢。

4

1 回答 1

1

我不确定我是否正确理解了您的代码。但我认为您只需将您的// send the sync message here线路替换为致电您的代表,例如[self.delegate fromSync:WHATEVERVALUEYOUWANTTOINFORMABOUT];.

于 2017-08-12T08:05:36.540 回答