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