Можно ли передавать данные как часть NSNotifications? - PullRequest
2 голосов
/ 29 февраля 2012

Сценарий в контексте карточной игры:

Пользователь перемещает карту по экрану. В результате перемещения координаты карты меняются. Если окажется, что карта находится в каком-то определенном месте, мы хотели бы убедиться, что объект Карты (Модель) обновлен и теперь содержит эти координаты.

Но View не должен напрямую разговаривать с моделью .., поэтому

Вместо непосредственного обновления Карты, View собирается уведомить Контроллер о том, что «Карта приземлилась». Получив это уведомление, я бы хотел, чтобы контроллер обновил местоположение карты вместо представления (модель обновления контроллера)

Вопрос 1: Правильно ли я думаю об этом типе сценария?

Вопрос 2: Можно ли отправить данные на контроллер вместе с уведомлением?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Вам не нужно NSNotifications для вашего сценария: должен подойти простой подход на основе делегатов.

Представление должно определять интерфейс делегата и обеспечивать не сохраняющий delegate собственность.Контроллер должен реализовать интерфейс делегата и установить себя в качестве делегата представления.Представление тогда уведомит своего делегата, даже не зная, что оно уведомляет контроллер.Затем контроллер передает уведомление модели.

@protocol CardDelegate
-(void)cardHasLanded:(SOCard*)card atPosition:(SOPosition*)pos;
@end

@interface MyView
@property (weak, nonatomic,readwrite) id<CardDelegate> delegate;
@end

@implementation MyViewController
-(id)init { // This should be in your designated initializer
    self = [super init];
    if (self) {
        MyView *view = [[MyView alloc] init];
        view.delegate = self;
        self.view = view;
    }
    return self;
}
-(void)cardHasLanded:(SOCard*)card atPosition:(SOPosition*)pos {
    // Update the model
}
@end

@implementation MyView
@synthesize delegate;
-(void) doSomething {
    // ...
    if (cardHasLanded) {
        [delegate cardHasLanded:card atPosition:pos];
    }
    // ... more code
}
@end
2 голосов
/ 29 февраля 2012

Для этого используются словарь userInfo и object из NSNotification.В данном случае это object, который вы хотите.Например:

// In your model header file

extern NSString * const CardMovedNotification;

// In your model implementation file

NSString * const CardMovedNotification = @"CardMoved";

...

[[NSNotificationCenter defaultCenter] postNotificationName:CardMovedNotification object:theCardThatMoved];

После этого ваши люди могут получить карту через [notification object].Если вам нужно передать больше информации, вы должны создать словарь и передать его как userInfo через postNotificationName:object:userInfo:.Затем наблюдатель может запросить его через [notification userInfo].

0 голосов
/ 29 февраля 2012

Я согласен, что никаких уведомлений не требуется. Обычно для координат объекта UI я не буду использовать объект модели, потому что координаты связаны с объектом UI (или где вы будете его рисовать?). Что вам нужно сделать, так это зарегистрировать свой контроллер для события окончания касания, передаваемого в объект пользовательского интерфейса, в котором было выполнено касание, и обновлять (в методе отвечающего контроллера) координаты объекта, если они действительно находятся в требуемом месте. (как с кнопками и другими объектами пользовательского интерфейса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...