Стандартная идиома для уведомлений об изменении свойства на iPhone - PullRequest
1 голос
/ 15 сентября 2010

Допустим, у меня есть простой объект, который представляет состояние головоломки. Загадка может быть решена или не решена. У меня есть два контроллера со ссылками на этот объект головоломки, и они визуально представляют состояние двумя различными способами - скажем, включением / выключением и красным / зеленым светом.

Когда свойство решаемой головоломки изменяется, контроллеры должны обновить свое представление, чтобы представить текущее состояние. Существует ли стандартная идиома для передачи информации об изменении состояния объекта головоломки на контроллер?

Моим первоначальным намерением было объявить собственный протокол и отследить наблюдателей в объекте головоломки. Когда измененное свойство изменилось, выполните итерацию по всем наблюдателям и вызовите определенный метод в протоколе. Это кажется достаточно распространенным шаблоном, что может быть какая-то встроенная поддержка, но я не смог найти именно то, что искал в документах.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

Хотя оба ответа до сих пор были сосредоточены на использовании NSNotification, и это совершенно верно, есть еще один способ сделать то, что вы хотите, встроенный в объекты Какао: Наблюдение значения ключа ,или КВО.Это немного легче и немного меньше «действия на расстоянии».Я предпочитаю использовать его, когда это возможно, для наблюдения за изменениями в моих классах моделей данных.YMMV.

1 голос
/ 15 сентября 2010

Вместо пользовательского протокола вы можете использовать уведомления следующим образом. В вашем контроллере, в viewDidLoad зарегистрируйтесь как наблюдатель

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(puzzleStateDidChange:)
                                                 name:@"PuzzleStateDidChange" object:nil];

затем реализовать

- (void)puzzleStateDidChange:(NSNotification *)notification
{

// set your switch and light according to the state notified
puzzleState = notification.object;
...

}

и, наконец, добавьте

[[NSNotificationCenter defaultCenter] removeObserver:self];

к методу dealloc для отмены регистрации в качестве наблюдателя.

Теперь вы готовы получать уведомления и реагировать соответственно. Чего не хватает, так это кода, который будет добавлен к вашему объекту головоломки. Каждый раз, когда состояние объекта головоломки изменяется,

используйте что-то вроде

[[NSNotificationCenter defaultCenter] postNotificationName:@"PuzzleStateDidChange" object:yourPuzzleState];

, чтобы уведомить ваших контроллеров об изменении состояния.

1 голос
/ 15 сентября 2010

Если я правильно понимаю, вы можете использовать NSNotification, чтобы делать то, что вы хотите.В вашем классе головоломки вы можете использовать postNotificationName, чтобы сообщить любому классу, который наблюдает, когда головоломка меняет состояние.Чтобы зарегистрировать класс в качестве наблюдателя для головоломки, используйте методы addObserver и removeObserver.Вот определения для трех методов:

-(void) postNotificationName:(NSString *) aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
-(void) addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
-(void) removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

Вот пример кода, который можно использовать для вашей программы:

В вашем классе головоломки, в функции, которая изменяет состояние:

[[NSNotificationCenter defaultCenter] postNotificationName:@"puzzleChangedState" object:self userInfo:NULL]
// if you want to send out moreInfo, like other variables, use userInfo with a dictionary object

В ваших контроллерах, представлениях и т. Д. Везде, где вы хотите получить сообщение об изменении состояния головоломки:

//In your constructor or initialization method, register this class with the puzzle class
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePuzzleChangedState:) name:@"puzzleChangedState" object:nil];

Это добавит ваш контроллер в NotificationCenter и, когда загадкакласс отправляет уведомление о "puzzleChangedState", будет вызван метод handlePuzzleChangedState: вашего контроллера.

Здесь handlePuzzleChangedState: function:

-(void) handlePuzzleChangedState:(NSNotification *) notification
{
    //handle your puzzle state change here
}

Если вам нужна дополнительная помощь, вот документы1017 *http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043i

Надеюсь, это сработает!

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