微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift 5 Delgate不会在ViewController中调用方法

如何解决Swift 5 Delgate不会在ViewController中调用方法

我有以下情况: 加载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)
        }
    }
}

    

在另一个ViewController中,我有以下内容

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 {

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。