【发布时间】: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。不太清楚为什么。我需要改变初始化的方式吗?