Можно ли использовать делегата для отправки сообщения, когда событие не создается UIButton?

Я хотел бы знать, как использовать делегата для отправки часового сообщения MyViewController из класса под названием MotionListener но у меня проблемы с переводом объяснения Apple target-action в работоспособную команду.

Целевое действие - это шаблон проектирования, в котором объект содержит информацию, необходимую для отправки сообщения другому объекту при возникновении события. Сохраненная информация состоит из двух элементов данных: селектор действия, который определяет метод, который должен быть вызван, и цель, которая является объектом для получения сообщения.] 1

У меня нет проблем с применением объяснения (выше) в примере (ниже) с myButton использование делегата для отправки сообщения цели fromButtonInSubview всякий раз, когда она нажата

        [mySyncButton addTarget:self.delegate
                         action:@selector(fromSyncButtonInSubview:)
               forControlEvents:UIControlEventTouchUpInside];

Я бы предположил, что для отправки сигнала, который не исходит от UIButton, Мне все еще нужно объявить протокол [a], присвоить ему свойство [c] и включить метод инициализации [b]

[а]

    @protocol SyncDelegate <NSObject>

    -(void)fromSync:(int)clock;

    @end

    @interface MotionListener : NSObject {

    }

[Ь]

    - (id) initMotionSensingWith:(float)updateInterval;

[с]

    @property (assign) id<SyncDelegate> delegate;

    @end

и объявить протокол в интерфейсе [d] и добавить целевой метод в реализацию [e]

[d]

    @interface PlayViewController : UIViewController <SyncDelegate>

[е]

    - (void)fromSync:(int)clock
    {
        NSLog(@"tick"); // do stuff and show
    }

затем в MyViewController, Импортировать MotionListener[f], объявите это в реализации [g] и определите делегат [h]

[F]

    #import "MotionListener.h"

[г]

    MotionListener *sync = [[MotionListener alloc] initMotionSensingWith:(float)updateInterval];

[час]

    sync.delegate = self;

Но, несмотря на перечитывание приведенного выше объяснения и после нескольких неудачных попыток, мне еще предстоит написать команду, которая отправит сигнал синхронизации от MotionListener в MyViewController. Я знаю, что это будет иметь эффект addTarget:self.delegate а также action:@selector(fromSync:) в UIButton пример (выше). И прежде чем кто-либо предлагает NSTimer selector, Я уже синхронизирую это на частоте 50 Гц, тогда как сигнал синхронизации составляет 1 Гц.

например

     [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? Ответ, вероятно, смущающе прост, но я могу надеть его, если вы можете помочь. Благодарю.

1 ответ

Решение

Я не уверен, правильно ли я понимаю ваш код. но я думаю, что вы просто должны заменить свой // send the sync message here линия с вызовом вашего делегата, как [self.delegate fromSync:WHATEVERVALUEYOUWANTTOINFORMABOUT];,

Другие вопросы по тегам