也许我在这里遗漏了一些非常基本的东西,但是在盯着代码看了一个小时左右之后,我的大脑正在经历一个周期,我希望能重新审视一下这个问题。
我有以下几点:

import UIKit

protocol DetailViewWillShowUpDelegate {
    func sendDetailOpened(_ openedBool: Bool)
}

class locationXIBController: UIView {

    @IBOutlet weak var loationLabel: UILabel!
    @IBOutlet weak var vsedniOteviraciDobaLabel: UILabel!
    @IBOutlet weak var prijmajiKartyLabel: UILabel!
    @IBOutlet weak var detailViewButtonOutlet: UIButton!
    @IBOutlet weak var backgroundViewButton: UIButton!

    let openedBool = true
    var detailViewWillShowUpDelegate: DetailViewWillShowUpDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    @IBAction func vecerkaDetailButtonPressed(_ sender: UIButton) {
        detailViewWillShowUpDelegate?.sendDetailOpened(openedBool)
        print("pressed")
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if let result = detailViewButtonOutlet.hitTest(convert(point, to: detailViewButtonOutlet), with: event) {
            return result
        }
        return backgroundViewButton.hitTest(convert(point, to: backgroundViewButton), with: event)
    }

}

现在的问题是,当我调用/按下UIView函数时,我在控制台中得到“按下”的输出,但是由于某种原因,协议没有通过。
另一面看起来是这样(为了简单起见,去掉了衣服):
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    let locationXIB = locationXIBController()
    let isVecerkaDetailOpened = false

    override func viewDidLoad() {
       locationXIB.detailViewWillShowUpDelegate = self
    }



extension MapViewController: DetailViewWillShowUpDelegate {
    func sendDetailOpened(_ openedBool: Bool) {
        isVecerkaDetailOpened = openedBool
        print("success")
    }
}

我知道执行时的协议值是零。如我所说,任何帮助都是感激的,谢谢!

最佳答案

首先,有几个命名约定问题:
对于locationXIBController对象,名称UIView是一个错误的选择。它是一个视图对象,而不是控制器对象。
其次,Swift中的类名应该以大写字母开头。所以LocationXIBView对于这个视图类来说是一个更好的名字。
接下来,你的代码

let locationXIB = locationXIBController()

……是错误的。这将创建一个从未在视图层次结构中安装的locationXIBController类的全新实例。你应该把那条线做成IBOutlet:
@IBOutlet weak var locationXIB: locationXIBController!

然后,您应该控制从脚本中的locationXIBController拖动到视图控制器中的出口。这将导致接口生成器连接插座。
现在,当您运行程序时,变量locationXIB将在加载时连接到脚本/XIB中的locationXIBController视图。

10-06 00:51