【问题标题】:Swift 5 Delgate does not call method in ViewControllerSwift 5 Delgate 不调用 ViewController 中的方法
【发布时间】:2020-11-12 16:29:33
【问题描述】:

我有以下情况: 当 MyViewController 加载时出现 PermissionView。当我点击 ok 时,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()
    }
}

有什么想法吗?

【问题讨论】:

  • 委托是控制器而不是视图。顺便说一句,为什么要将按钮连接到视图而不是控制器?
  • PermissionView 是预先存在的,它是一个 .xib 并包含两个按钮。所有其他人都在故事板中。如果需要,它会出现在几个不同的 ViewController 之上。
  • 如果我理解 print("ok!") 被调用,那么,delegate 是 nil 吗?还是delegate?.responds(to: #selector(PermissionViewDelegate.permissionGiven(_:))) 返回false?另外,调用方法时 self 是什么?是添加的视图(您对 addSubview() 所做的视图,还是视图本身?
  • 所以 okPressed 内部的委托是 nil。不太清楚为什么。我需要改变初始化的方式吗?

标签: swift delegates protocols


【解决方案1】:

我认为,您需要的是删除下一行,因为您不需要检查 responds 方法,只需要 ckech 如果委托不是 nil,尽管您已经使用标志 '? '

if delegate?.responds(to: #selector(PermissionViewDelegate.permissionGiven(_:))) ?? false { }

if delegate?.responds(to: #selector(PermissionViewDelegate.permissionDenied(_:))) ?? false {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2019-03-05
    • 2022-11-08
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多