iOS Google 地图 API - 从一个视图控制器发送一个 GMSMapview 到另一个

iOS Google Maps API - send a GMSMapview from one view controller in another

我对 iOS 开发比较陌生,对使用 Google 地图 API.

完全陌生

我有两个单独的视图,我想要一个地图视图。第一个是允许您在地图上查找位置、输入地址或使用您当前位置的场景。在下一个场景中,我想使用用户从前一个场景输入的相同位置,但我想使用卫星视图而不是常规地图,并且会有一些额外的工具来操纵地图以达到目的我的应用程序。

我需要有两个独立的场景,因为界面非常不同,但我无法将信息从一个地图视图发送到另一个地图视图。这是我尝试过的几种方法(其中两种被注释掉):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showServiceArea"]) {
    ServiceAreaViewController *destViewController = segue.destinationViewController;
    destViewController.camera = [GMSCameraPosition cameraWithLatitude:curLocation.location.coordinate.latitude longitude:curLocation.location.coordinate.longitude zoom:17]; //Setting up a camera in the next scene using the curLocation coordinates from the current view
    //destViewController.view = _mapView;  //Setting the next view controller's view to the current mapView and changing the mapType to satellite
    //_mapView.mapType = kGMSTypeSatellite;
    //destViewController.serviceAreaMapView = _mapView;  //copying the current mapview to a mapview on the next scene
    //destViewController.serviceAreaMapView.mapType = kGMSTypeSatellite;
}

}

我尝试过的每一种方法都引发了异常并导致我的应用程序崩溃。这是上述代码崩溃的输出:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController setCamera:]: unrecognized selector sent to instance 0x17e73eb0'

对于前两个注释掉的方法,我认为在加载下一个场景时,我分配给下一个视图的数据正在被删除。我不确定我当前的代码有什么问题。

任何人都可以指出正确的方向以使用当前场景的数据在后续场景中生成 mapView 吗?谢谢。

我认为你不应该在两个控制器之间传递 UI。您应该只将非 UI 数据传递给您的第二个控制器。特别是你的 UI 数据可能很弱,可能会变成零。此外,prepareForSegue 发生在加载第二个控制器的视图之前,无论您传递给第二个控制器的 UI 数据都不会被设置。

相互传递数据的正确方法是传递非UI数据。例如,如果您的第一个控制器中有 UITextView,则不应执行 secondController.textView = firstController.textView;,而应传递非 UI 属性。所以你需要在你的控制器中做一个NSString *myText;,然后你可以在你的第一个控制器的prepareForSegue方法中做secondController.myText = self.myText;。在 viewWillLoad()viewDidLoaded() 方法中加载第二个控制器的视图(将加载 UITextView)时,您可以使用第二个中的 myText 数据设置 UITextView控制器:self.textView = myText

在你的情况下,你不应该将 mapView 从你的第一个控制器传递到第二个控制器,你应该声明变量来保存你的 mapView 在你的第二个控制器中,然后你可以传递非UI mapView 属性数据到第二个控制器中的强变量。