我正在阅读线程:另一个视图控制器的IBOutlet为零
我有一个与此非常相似的问题。
请求视图控制器
class DenunciasResueltasViewController: UIViewController {
@IBOutlet var mapView: GMSMapView!
var solicitudes = [SolicitudesModel]()
var tempMap: GMSMapView!
override func viewDidLoad() {
super.viewDidLoad()
let camera = GMSCameraPosition.camera(withLatitude: 3.4824182, longitude: -8.1776567, zoom: 15)
self.mapView.camera = camera
}
func recenterMap(latitude:Float!, longitude:Float!) -> Void {
let coordinates = CLLocationCoordinate2DMake(CLLocationDegrees(latitude), CLLocationDegrees(longitude))
mapView = tempMap
self.mapView.animate(toLocation: coordinates)
}
请求表视图控制器
class RequestTableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//Some code to fill the table
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "RequestVC") as! RequestViewController
viewController.recenterMap(latitude: solicitudes[indexPath.row].getLatitude(), longitude: solicitudes[indexPath.row].getLongitude() )
return cell
}
}
这两个组件在运行时同时初始化,我的意思是,两者都是同一视图的一部分。
当用户单击"行"时,我想更新mapView
为此,我正在使用"RecenterMap"方法。
但是,变量"self.mapView"始终为"nil"。如何更新此值?
您应该使用 delegate 方法didSelectRowAtIndexPath
来重新居中,因为当用户在单元格上点击应用程序时会调用此方法。可能是第一个视图控制器的插座尚未设置,当第二个视图控制器开始填充其单元格时。
这是一个常见问题,想要在呈现当前屏幕外的 vc 之前访问它的属性。
您可以通过访问视图来强制构建视图层次结构来解决此问题:
let _ = viewController.view
在此之后,您可以自由访问视图控制器上任何与视图相关的属性。所以你应该把它放在你调用.recenterMap
目前还不清楚您要做什么:您的代码似乎为每个表单元格实例化了一个带有 map 的视图控制器,但您在实例化后实际上并没有呈现它。
您实例化了RequestViewController
,但它不会出现在视图层次结构中,因此在调用IBOutlet
属性时不会实例化它们。通常,在UIViewController
上调用view
会实例化其上的所有插座。或者,您可以调用self.present(requestViewController)
以显示它。
我的理解是,你同时拥有RequestViewController和RequestTableViewController,两者都是父视图的子视图,
1-您的地图中心函数需要在委托方法上调用:
didSelectRowAtIndexPath:
2-您需要对请求视图控制器的引用,并且不要从情节提要中实例化它。 因为您将获得一个新实例,而不是已经显示的实例。