NSNotification на Swift: пример использования

NSNotification-proSwift_ru

Как и обещал, в данной статье будет описан пример 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  и одну оранжевую кнопку мы добавили программно — из кода. Если запустить приложение, то вы увидите следующую картину:

NSNotification_proSwift_ru_z9c0a

Если быть точным, то приложение не запуститься, пока мы не добавим метод 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().

Вот и все. Запустим наше приложение.

NSNotification_proSwift_ru_jkdzb

Подписка на системное уведомление

Мы самостоятельно заставили послать уведомление и отреагировали на него. Стоит отметить, что 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("Приложение перешло в фон")
}

Посыл уведомления случится при переходе приложения в фон. Запустите и проверьте что получилось.

NSNotification_proSwift_ru_dwfom

Ссылка на GitHub

https://github.com/Ironrnd/NSNotification