Формы связи в iOS

В этой статье рассмотрены  принципы делегирования, уведомления и target-action.

1 Делегация.
Делегирование — механизм, при котором один объект отправляет сообщение другому объекту, выступающему как делегат, в случае возникновении какой-то необходимости или события (уведомление, запрос данных и т.д.).
Под отправкой сообщений подразумевается вызов методов.
Рассмотрим делегацию на примере UITableView.



UITableView это класс, который представляет из себя виджет (графический интерфейс) в iOS системах. Это таблица.
UITableView активно использует делегацию, которая разделяется на два вида:
1 dataSource
2 delegate
«По каналу» dataSource виджет TableView посылает сообщения и требует от своего делегата данные.
«По каналу» же delegate он посылает сообщения о событиях, которые происходят с таблицей.
Давайте рассмотрим три базовых сообщений dataSource, строящих табличку:
1 Необходимо задать число секций в ней;
2 Число строк в каждой секции;
3 Содержимое каждой строки.
Для этого TableView вызывает следующие методы у объекта, который является делегатом:
1 Задает число секций  в таблице.
dataSource: numberOfSectionsInTableView:
2 Задает число строк в секции.
dataSource: tableView:numberOfRowsInSection:
Таблица сформирована, но не хватает самих данных, т.е. содержимого ячеек.

3 Запись данных в ячейки.
dataSource: tableView:cellForRowAtIndexPath:
TableView требует ячейку для строки по координатам, указанным в параметре indexPath , а делегат возвращает уже сформированную ячейку в таблицу.
Таблица сформирована, и когда пользователь хочет выбрать ячейку, TableView пошлет «по каналу» delegate сообщение о событии. Например,  для выбора ячейки используется метод tableView:willSelectRowAtIndexPath:.
Потом он эту ячейку подсветит, и пошлет сообщение «выбрал ячейку с такими-то координатами».
delegate:tableView:didSelectRowAtIndexPath:

2 Уведомления (Notifications)
Уведомление  это сообщение, посланное одному или нескольким объектам, с целью проинформировать их о наступающем (наступившем) событии.
Используется модель широковещания, когда мы посылаем сообщение только один раз, а все «подписавшиеся» на это сообщение объекты получают его.

Центром доставки таких сообщений является NotificationCenter, который представлен классом NSNotificationCenter.

Например, объект отправляет уведомление, для этого он посылает его в NotificationCenter, который уже «позаботится» о широковещательной доставке этого сообщения всем слушателям. В качестве аналогии можно привести работу радио. NotificationCenter — это оборудование (микрофон, трансмиттер, антенна), а диктор это объект, который отправляет сообщение через микрофон, а радиослушатели это все слушатели, которые подписались на эту радиостанцию.
Чтобы подписаться на уведомление необходимо знать его имя. Когда мы подпишемся на уведомление, то мы будем получать его в виде объекта класса NSNotification. Если мы хотим отправить уведомление, то мы должны отправит объект класса NSNotification в NotificationCenter.


Поле name содержит название уведомления, которое является строкой (NSString), а поле object содержит ссылку на объект, который отправил это уведомление.

Примеры системных уведомлений:

  • UIApplicationWillEnterForegroundNotification — посылается объектом класса UIApplication (в iOS) перед тем, как приложение будет выведено из фонового режима работы.
  • UIApplicationWillTerminateNotification -посылается объектом UIApplication (в iOS) за мгновение до того, как приложение завершит свою работу.
  • UIKeyboardWillShowNotification — посылается объектом, представляющим экранную клавиатуру (в iOS), перед тем как она покажется на экране. userInfo содержит такие значения, как размер клавиатуры, время анимации клавиатуры на экране и т.д.

Подписаться на уведомление.


-(void)viewDidLoad{
   [[NSNotificationCenter defaultCenter]addObserver:self
                                            selector:@selector(applicationWillTerminateNotification:)
                                             name:UIApplicationTerminateNotificatio
                                           object:nil];
}
 -(void)applicationWillTerminateNotification:( NSNotification *)n {
 //
}

Для этого мы обращаемся к NotificationCenter, вызвав метод defaultCenter у класса NSNotificationCenter. Он возвратит вам NotificationCenter, который автоматически создается для каждого приложения. И мы говорим NotificationCenter: «добавь в слушателя меня» — addObserver:self и
«вызови метод» — applicationWillTerminateNotification при получении уведомления UIApplicationWillTerminateNotification. При этом отправителем может быть любой объект (object:nil).

Отправка своих уведомлений.


 -(void)sendMessage:(NSString *)messageText{
    NSDictionary *notificationInfo = [NSDictionary dictionaryObject:messageText forKey:@"text"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"messageWasSent"  
                                                       object:self
                                                    userInfo:notificationInfo];
  }

И так, что мы сделали: создали словарь (Dictionary) с одним единственным ключом «text», которому будет соответствовать наше пользовательское сообщение messageText в userInfo. Для отправки сообщения вызываем метод у NotificationCenter, который называется postNotificationName:object:usetInfo. Этот метод автоматически создаст объект класса NSNotification и отправит его. Достаточно указать название этого метода (messageWasSent),  отправителя (self) и пользовательские данные userInfo.

3 Target-Action
Каждый графический интерфейс (виджет) в iOS имеет target и action. Target — это объект, которому посылается сообщение, когда с виджетом происходит что-то заранее определенное. Action — это сообщение, которое он посылает. Это сообщение всегда имеет один аргумент.
То есть, в контролере мы определяем цель (Target), и когда это событие происходит. View отправляет действие (Action) вашему объекту.
Например,


 -(void)viewDidLoad{
   [self.button addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
   }
  -(void)buttonClicked{  
 //
 }

Добавит в качестве  target себя  и выполнит action (действие) при наступлении события: нажатия на кнопку.

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий