NSNotification на Swift: пример использования
Как и обещал, в данной статье будет описан пример iOS приложения на языке Swift в среде разработки Xcode, которе использует встроенный механизм посылки, приема и обработки сообщений NSNotification.
Итак, давайте создадим простое приложения с набором разноцветных UIView и кнопкой, по нажатию на которую эти view будут изменять свое местоположение.
Создание приложения
Как обычно откройте Xcode, нажмите на создание нового приложения Single View Application. В файле с классом ViewController измените код класса — добавьте три свойства и измените метод viewDidLoad():
// // proSwift.ru // class ViewController: UIViewController { let blueView = UIView(frame: CGRect(x: 20, y: 30, width: 70, height: 80)) let greenView = UIView(frame: CGRect(x: 100, y: 30, width: 70, height: 80)) let grayView = UIView(frame: CGRect(x: 180, y: 30, width: 70, height: 80)) override func viewDidLoad() { super.viewDidLoad() blueView.backgroundColor = UIColor.blueColor() greenView.backgroundColor = UIColor.greenColor() grayView.backgroundColor = UIColor.grayColor() view.addSubview(blueView) view.addSubview(greenView) view.addSubview(grayView) let runButton = UIButton(frame: CGRect(x: 70, y: 180, width: 134, height: 26)) runButton.setTitle("Запуск", forState: UIControlState.Normal) runButton.setTitleColor(UIColor.lightGrayColor(), forState: .Highlighted) runButton.backgroundColor = UIColor.orangeColor() runButton.layer.cornerRadius = 6 runButton.addTarget(self, action: #selector(runActon), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(runButton) } }
Все достаточно стандартно. Три цветных UIView и одну оранжевую кнопку мы добавили программно — из кода. Если запустить приложение, то вы увидите следующую картину:
Если быть точным, то приложение не запуститься, пока мы не добавим метод runActon() обработки нажатия на оранжевую кнопку. Для начала можно просто вывести уведомление в консоль.
// // proSwift.ru // func runActon() { print("tap") }
Добавление наблюдателя, реакции и посыл уведомления.
Для реализации нашей задумки вовсе не обязательно использовать механизм NSNotification. Однако для демонстрации возможностей связь между нажатием кнопки и цветными UIView мы сделаем с помощью уведомлений.
Нам нужно в центр уведомлений добавить наблюдателя определенного события. После добавления кнопки на экран в метод viewDidLoad() добавьте строку
// // proSwift.ru // // Добавим обозревателя для события нажатия на оранжевую кнопку NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(notificationAction), name: "OrangeButtonTapped", object: nil)
Внимательно посмотрите на эту строку. Конструкция NSNotificationCenter.defaultCenter() возвращает центр уведомления операционной системы. Методом addObserver() мы добавляем наблюдателя. Наблюдателем будет наш класс ViewController, поэтому в первый параметр мы передаем self. Следующий параметр — это имя метода, который будет вызван у нашего ViewController при получении уведомления. Параметр name — это имя уведомления, по которому центр уведомлений будет отслеживать и реагировать на получение уведомления. Последний параметр — nli, однако следует учитывать, что можно передать определенные данные с помощью уведомлений и в последующем их обработать.
Мы добавили наблюдателя, теперь нужно добавить метод реакции — notificationAction(). В нем можно сделать все что угодно. Я изменю положение цветных вьюшек на экране. Как сделать анимацию в iOS приложении можно почитать в статье Особенности анимации UIView
// proSwift.ru // func notificationAction() { print("Наблюдатель увидел сообщение") UIView.animateWithDuration(1.5, delay: 0.0, options: .CurveEaseInOut, animations: { self.blueView.center = CGPoint(x: self.blueView.center.x + 160, y: self.blueView.center.y) self.greenView.center = CGPoint(x: self.greenView.center.x, y: self.greenView.center.y + 40) self.grayView.center = CGPoint(x: self.grayView.center.x - 160, y: self.grayView.center.y) }, completion: nil) }
Теперь нужно послать уведомление с нужным нами именем. Посылать это уведомление мы будем при нажатии на оранжевую кнопку. Поэтому в метод runAction() следует изменить:
// // proSwift.ru // func runActon() { //print("tap") NSNotificationCenter.defaultCenter().postNotificationName("OrangeButtonTapped", object: nil) }
Мы просим центр уведомлений послать уведомление с именем «OrangeButtonTapped«. Т.к. у нас есть слушатель уведомления с таким именем, — у нас вызовется метод notificationAction().
Вот и все. Запустим наше приложение.
Подписка на системное уведомление
Мы самостоятельно заставили послать уведомление и отреагировали на него. Стоит отметить, что iOS приложение посылает уведомления при переходах между состояниями жизненного цикла. (можно почитать в статье iOS Application Lifecycle, или жизненный цикл iOS приложения). Давайте добавим наблюдателя и реакцию на это событие. На самом деле наблюдатель добавляется одной строкой, а реакция может быть какой угодно. Мы выведем сроку в консоль.
В конец метода viewDidLoad() добавьте строку:
// // proSwift.ru // // Добавим обозревателя для события перехода приложения в фон NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(appDidEnterBackground), name: UIApplicationDidEnterBackgroundNotification, object: nil)
И реакцию на событие в метод, указанный в #selector:
// // proSwift.ru // func appDidEnterBackground() { print("Приложение перешло в фон") }
Посыл уведомления случится при переходе приложения в фон. Запустите и проверьте что получилось.
Ссылка на GitHub
https://github.com/Ironrnd/NSNotification