【发布时间】:2021-01-28 14:03:37
【问题描述】:
您好,我有一个带有mapView 的父视图控制器和一个子视图控制器,作为底部的一个小容器视图,并且该容器视图通常是隐藏的。当我从父视图控制器点击mapView 上的标记时,我想显示该容器视图并将子视图控制器上的标签更改为我从数据库中获取的值。
现在,我在这里调用父视图控制器的函数(当点击标记时)以更改子视图控制器上的标签。
在我的父视图控制器中:
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
AddressViewController.ID.selectedID = marker.snippet ?? ""
UIView.transition(with: AddressView, duration: 1, options: .transitionFlipFromBottom, animations: {self.AddressView.isHidden = false}, completion: nil)
let AddressViewController = AddressViewController()
AddressViewController.loadAddressView()
let camera = GMSCameraPosition.camera(withTarget: marker.position, zoom: 16)
mapView.animate(to: camera)
return true
}
在 AddressViewController(子视图控制器)中
func loadAddressView() {
if ID.selectedID == "" {
print("ID did not pass")
return
}
else {
print("function worked")
ref = Database.database().reference().child("Items").child(ID.selectedID)
ref?.observeSingleEvent(of: .value, with: {(snapshot) in
let value = snapshot.value as? NSDictionary
self.ItemNameLabel.text = value?["ItemName"] as? String ?? ""
self.addressLabel.text = value?["AddressDisplay"] as? String ?? ""
})
}
}
发生的情况是,当我运行它并按下标记时,它崩溃了,它告诉我 ItemNameLabel 是“在展开可选值时意外发现 nil”。但是,我可以告诉该函数仍然被调用,因为“函数有效”(上图)仍然被打印,只有标签被发现为零。所以我尝试了诸如使用委托和协议来调用函数之类的方法,虽然它没有崩溃,但由于某种原因从未调用过委托(我可能做错了——如果这是解决问题的方法,如果有人请解释一下我的情况,我会很高兴的)。我还尝试将我的标签设置为子视图控制器的 viewDidLoad 中的数据库数据,并从父视图控制器调用子视图控制器的 loadView() ,这没有崩溃,但也没有更改标签。
有人知道如何解决这个问题吗?提前致谢。
【问题讨论】:
-
AddressViewController()不是故事板中的实例。您需要通过 segue 或实例化的 真实 引用。 -
@vadian 我确实尝试过实例化,但我的标签出现了同样的错误。
-
在实例化之后标签尚未连接。您必须使用临时变量并在
viewDidLoad中设置标签 -
@vadian 你能举个例子吗?
标签: ios swift viewcontroller