将参数UIbutton添加到NotificationCenter观察器

时间:2018-09-14 01:26:06

标签: ios swift uibutton nsnotificationcenter

我有一个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 :(得分:0)

我认为没有必要使用Notification。一种无需花费太多代码即可实现的方法是在按钮上添加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函数中,点击按钮时应该执行的操作是发布通知而不添加观察者。

答案 1 :(得分:0)

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

在上面的行中,您正在添加button作为目标,因此它希望在UIButton的实现中定义handleEmotion。因此,您将收到错误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])