Это нормально для представления знать о его контроллере? - PullRequest
2 голосов
/ 27 февраля 2012

Я бы хотел, чтобы мой контроллер подписывался на уведомления от просмотра. Однако, прежде чем сделать это, я хотел бы подтвердить, если нормально для представления знать экземпляр своего контроллера?

Позвольте мне предложить вам более конкретный пример того, что я имею в виду.

Мой контроллер создает представление и сообщает ему, что это его контроллер

self.gameView = [[GameView alloc] initWithController:self];

После этого он подписывается на уведомления из этого представления

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

Между тем, представление делает свое дело, но когда наступает подходящее время, оно отправляет уведомление

[[NSNotificationCenter defaultCenter] postNotificationName:
                                        @"SaySomethingClever" object:gvc];

Чтобы сделать это, представлению необходимо знать получателя уведомления (gvc).

Я хотел бы использовать эту возможность, и как вы, все ли в порядке:

Когда вызывается initWithController, представление

-(id) initWithController: (GameViewController* )g {
    gvc = g;
    return [self initWithFrame:CGRectMake(0, 0, 480, 300)];
}

где initWithFrame:CGRectMake - это закрытый метод, который обрабатывает определенные элементы представления.

Все отлично работает, однако мне интересно, является ли этот подход морально приемлемым

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

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

Аргумент object не является получателем,В самом деле, если бы это было - если бы создатель уведомления должен был знать объект, который собирался получить уведомление, - это нанесло бы ущерб всей цели уведомления.Вы можете просто вызвать соответствующий метод!Точка уведомлений состоит в том, что постеру не нужно знать другие объекты, которые слушают.

Аргумент object фактически используется получателем чтобы определить, какие уведомления должны заботиться.Чаще всего аргументом является сам плакат:

[[NSNotificationCenter defaultCenter] postNotificationName:IDidSomethingInteresting
                                                    object:self];

, но на самом деле это может быть любой объект.

При регистрации для уведомлений вы можете указать конкретный экземпляр, уведомления которого выинтересует. Это аргумент object для addObserver:... Центр уведомлений затем будет передавать только те уведомления, чьи имена и объект соответствуют указанному.

Даже если вы передадите nil для object в addObserver:..., вы можете проверить объект полученного уведомления и действовать, только если это был интересующий вас плакат.

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

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

См. также: «Отправка уведомлений»

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

Хотя с концепцией все в порядке, в вашем случае она не нужна:

[[NSNotificationCenter defaultCenter] postNotificationName:@"SaySomethingClever"
                                                    object:self];

Объект, на который ссылается NSNotification, обычно является объектом, который отправляет уведомление.Идея уведомления заключается в том, что постерам не нужно знать о наблюдателях.

1 голос
/ 27 февраля 2012

Я бы сосредоточился на контроллерах, вызывающих другие контроллеры (или в идеале модели методов).
Разрешить каждому представлению работать со своим основным ресурсом и разрешить контроллеру для этого представления совершать дополнительные вызовы.

...