我试图将一个简单的值传递给实例化的视图控制器。我不确定这样做的正确方法。
我已经研究了协议和委托,我已经在我的应用程序中的一些地方使用过,并且仍然感到困惑,但是随后遇到了一个看起来更简单的解决方案,我无法理解去工作。
此解决方案是在实例化时更新实例化视图控制器中的变量。
我正在使用Mapbox,并在点击注释时,希望将存储在数据库中的唯一值传递给有关该注释的详细信息视图。我已将下面的示例简化为我认为对解决问题至关重要的所有内容。
在我的第一个视图控制器中,地图视图:
// function that fires on annotation tap
func mapView(_ mapView: MGLMapView, didSelect annotation: MGLAnnotation) {
let placeID = "123456" // simplified for the purpose of this question
func createPlaceDetailSheet() {
let placeDetailSheet = PlaceDetailViewController()
self.addChildViewController(placeDetailSheet)
self.view.addSubview(placeDetailSheet.view)
placeDetailSheet.didMove(toParentViewController: self)
let height = view.frame.height
let width = view.frame.width
placeDetailSheet.view.frame = CGRect(x: 0, y: self.view.frame.maxY, width: width, height: height)
placeDetailSheet.uniqueID = "123456" // trying to set value here
}
createPlaceDetailSheet()
}
在第二个视图控制器中,我具有以下内容:
class PlaceDetailViewController: UIViewController {
var uniqueID: String = ""
override func viewDidLoad() {
super.viewDidLoad()
print(uniqueID)
}
}
我希望从第二个视图控制器中打印出唯一的ID(“ 123456”),但仅打印空字符串初始化程序。
我已经阅读了数小时的有关堆栈溢出的文章,试图解决这个问题,这是我的全部智慧。大多数答案依赖于performSegue的用法,而我没有使用。我也不确定上述方法或使用协议和委托是否正确。
谢谢。
答案 0 :(得分:0)
当您访问变量以添加子视图时,将加载视图,因此,在设置控制器的viewDidLoad
值之前,将执行uniqueID
方法中的打印语句。
在设置控制器类后立即设置uniqueID
。
let placeDetailSheet = PlaceDetailViewController()
placeDetailSheet.uniqueID = "123456"
或者,创建一个以唯一ID作为参数的自定义控制器初始化程序。
class PlaceDetailViewController: UIViewController {
// MARK: Properties
var uniqueID: String = ""
// MARK: Initializers
init(uniqueID: String) {
self.uniqueID = uniqueID
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
// MARK: View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
print(uniqueID)
}
}
let placeDetailSheet = PlaceDetailViewController(uniqueID: "foo")