从同时加载的表 ViewController 访问 ViewController 出口

Access to ViewController outlet from TableViewController loaded at same time

我正在阅读线程:

我有一个与此非常相似的问题。

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
    }
}

两个组件在运行时同时初始化,我的意思是,它们都是同一个视图的一部分。

当用户点击 'row' 我想更新 mapView

出于这个原因,我正在使用方法 'RecenterMap'

但是,变量 'self.mapView' 总是 'nil'。 我如何更新这个值?

您应该使用委托方法 didSelectRowAtIndexPath 进行重新居中,因为这会在用户点击单元格时调用。可能是第一个 viewcontroller 的出口在第二个开始填充其单元格时尚未设置。

这是一个常见问题,想要在展示之前访问当前屏幕外的属性 vc。

您可以通过访问其视图强制构建视图层次结构来解决此问题:

let _ = viewController.view

在此之后,您可以自由访问 viewcontroller 上的任何 view-related 属性。所以你应该把它放在你打电话之前 .recenterMap

不太清楚您要做什么:您的代码似乎为每个 table 单元格实例化了一个带有映射的视图控制器,但实例化后您实际上并没有呈现它。

您实例化了 RequestViewController,但它没有出现在视图层次结构中,因此 IBOutlet 属性在您调用它们时并未实例化。通常在 UIViewController 上调用 view 会实例化其上的所有插座。 或者,您可以调用 self.present(requestViewController) 以使其显示。

我的理解是,你有 RequestViewController 和 RequestTableViewController,它们都是父视图的子视图,

1- 需要在委托方法上调用地图功能中心:

didSelectRowAtIndexPath:

2- 您需要对 RequestViewController 的引用并且不要从情节提要中对其进行实例化。 因为您将获得一个新实例,而不是已经显示的实例。