问题描述
我有以下情况: 加载MyViewController时,将显示PermissionView。当我点击确定时,将执行PermissionView中的okButtonpressed函数。
但是,MyViewController内部的PermissionGiven函数无法执行。
剩下的PermissionView仍在屏幕上保持活动状态。
@objc protocol PermissionViewDelegate: NSObjectProtocol {
func permissionDenied(_ sender: UIButton)
func permissionGiven(_ sender: UIButton)
}
class PermissionView: UIView {
@IBOutlet var cancelButton: UIButton!
@IBOutlet var okButton: UIButton!
weak var delegate: PermissionViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
let permissionView = Bundle.main.loadNibNamed("PermissionView",owner: nil,options: nil)?.first as! PermissionView
self.addSubview(permissionView)
self.frame = frame
okButton = permissionView.okButton
cancelButton = permissionView.cancelButton
}
@IBAction func okButtonpressed(_ sender: UIButton) {
print("ok!")
if delegate?.responds(to: #selector(PermissionViewDelegate.permissionGiven(_:))) ?? false {
delegate?.permissionGiven(sender)
}
}
@IBAction func cancelButtonpressed(_ sender: UIButton) {
print("cancel!")
if delegate?.responds(to: #selector(PermissionViewDelegate.permissionDenied(_:))) ?? false {
delegate?.permissionDenied(sender)
}
}
}
class MyViewController: PermissionViewDelegate { // implements other delegates as well
private var permissionView: PermissionView?
override func viewDidLoad() {
super.viewDidLoad()
if !(permissionView != nil) {
permissionView = PermissionView(frame: view.frame)
permissionView?.delegate = self
permissionView?.setimage(UIImage(named: "permission_notification"))
//other properties set
view.addSubview(permissionView!)
permissionView?.center = view.center
}
func permissionGiven(_ sender: UIButton) {
permissionView?.removeFromSuperview()
Utils.setBoolForKey(true,forKey: Utils.NOTIFICATION_PERMISSION())
Utils.setBoolForKey(true,forKey: Utils.NOTIFICATION_PERMISSION_VIEWED())
(UIApplication.shared.delegate as? AppDelegate)?.registerForNotifications()
enableControls()
}
}
有什么想法吗?
解决方法
我认为,您需要删除下几行,因为您不需要检查responds
方法,只需要检查一下如果委托不是nil,尽管您已经使用了标志'?'
if delegate?.responds(to: #selector(PermissionViewDelegate.permissionGiven(_:))) ?? false { }
if delegate?.responds(to: #selector(PermissionViewDelegate.permissionDenied(_:))) ?? false {