Добавить параметр UIbutton в наблюдатель NotificationCenter - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть наблюдатель Notification, который запускает функцию, которая принимает параметр типа UIButton.

Я постоянно пытаюсь заставить работать уведомления, но по какой-то причине я получаю unrecognized selector sent to instance

Вот мой код:

func circleMenu(_: CircleMenu, willDisplay button: UIButton, atIndex: Int) {
        let highlightedImage = UIImage(named: items[atIndex])
        button.setImage(highlightedImage, for: .normal)
        button.imageView?.contentMode = .scaleAspectFill

        switch atIndex {
        case 0:
            button.tag = 0
            NotificationCenter.default.addObserver(button, selector: #selector(handleEmotion), name: Notification.Name("sendnotif"), object: nil)
        case 1:
            print("Do something else")
        default:
            break
        }

    }

@objc func handleEmotion(_ note: Notification, sender: UIButton) {
        if sender.tag == 0 {
            sender.layer.borderColor = blueColor.cgColor
            sender.layer.borderWidth = 2
        }
    }

Меня беспокоиткак именно я должен заставить этот бит кода работать для case 0 и впоследствии для всех случаев, и как мне эффективно передать ему свою кнопку.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018
NotificationCenter.default.addObserver(button, selector: #selector(handleEmotion), name: Notification.Name("sendnotif"), object: nil)

С помощью приведенной выше строки вы добавляете кнопку в качестве цели и, следовательно, ожидаете, что handleEmotion будет определен в реализации UIButton. И, следовательно, вы получаете ошибку unrecognized selector sent to instance

Если у вас есть доступ к кнопке, при публикации уведомления вы можете сделать следующее. Добавьте наблюдателя в viewWillAppear

NotificationCenter.default.addObserver(self, selector: #selector(handleEmotion), name: Notification.Name("sendnotif"), object: nil)

А затем измените код как

@objc func handleEmotion(note: Notification) {
    if let userInfo = note.userInfo {
        if let button = userInfo["button"] {
         if button.view?.tag == 0 {
            button.layer.borderColor = blueColor.cgColor
            button.layer.borderWidth = 2
         }
        }
    }
}

Вы можете использовать ниже при публикации уведомления

    NotificationCenter.default.post(name: Notification.Name("sendnotif"), object: self, userInfo: ["button":button])
0 голосов
/ 14 сентября 2018

Я не думаю, что использование уведомлений необходимо. Одним из способов, не меняя большую часть своего кода, является добавлениеGestureRecognizer к кнопкам и предварительная установка тега кнопок с соответствующим индексом при их создании.

let button = UIButton()
button.tag = index
button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleEmotion(_:))))

func circleMenu(_: CircleMenu, willDisplay button: UIButton, atIndex: Int) {
    let highlightedImage = UIImage(named: items[atIndex])
    button.setImage(highlightedImage, for: .normal)
    button.imageView?.contentMode = .scaleAspectFill
}

@objc func handleEmotion(_ sender: UIGestureRecognizer) {
    if sender.view?.tag == 0 {
        sender.layer.borderColor = blueColor.cgColor
        sender.layer.borderWidth = 2
    }
}

А что касается уведомления, то в этом случае NotificationCenter.addObserver не должен помещаться туда. Он должен вызываться только один раз, поэтому, возможно, поместите его в viewDidLoad (). Затем в функции circleMenu при нажатии кнопки необходимо сделать сообщение, а не добавлять наблюдателя.

...