Можно ли использовать делегата для отправки сообщения, когда событие не создается 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];
,