我正在阅读帖子:IBOutlet of another view controller is nil
我有一个非常类似的问题。
RequestViewController
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)
}
RequestTableViewController
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'。 我如何更新这个值?
答案 0 :(得分:0)
您应该使用委托方法didSelectRowAtIndexPath
进行重新定位,因为当用户对单元格进行tapp时会调用此方法。可能是第一个视图控制器的奥特莱斯还没有在第二个开始填充其细胞时设置。
答案 1 :(得分:0)
这是一个常见问题,想要在呈现之前访问当前屏幕外vc的属性。
您可以通过访问视图来强制构建视图层次结构来解决它:
let _ = viewController.view
在此之后,您可以自由访问viewcontroller上任何与视图相关的属性。所以你应该在致电.recenterMap
答案 2 :(得分:0)
你真的不清楚你想要做什么:你的代码似乎用每个表格单元格的地图实例化一个视图控制器,但是在实例化之后你实际上并没有提供它。
您实例化RequestViewController
,但它不会出现在视图层次结构中,因此当您调用IBOutlet
属性时,{I}}属性不会被实例化。通常在view
上调用UIViewController
会实例化其上的所有插座。
或者,您可以致电self.present(requestViewController)
以便呈现它。
答案 3 :(得分:0)
我的理解是,你有RequestViewController和RequestTableViewController,都是父视图的子视图,
1-需要在委托方法上调用您的地图中心函数:
didSelectRowAtIndexPath:
2-你需要一个对RequestViewController的引用,不要从STORYBO中安装它。因为你将获得一个新实例,而不是已经显示的实例。