【问题标题】:iOS Google Maps API - send a GMSMapview from one view controller in anotheriOS Google Maps API - 从另一个视图控制器发送 GMSMapview
【发布时间】:2015-02-08 23:25:25
【问题描述】:

我对 iOS 开发人员比较陌生,对使用 Google Maps 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;
}

}

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

由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[UIViewController setCamera:]: unrecognized selector sent to instance 0x17e73eb0'

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

谁能指出我正确的方向,以使用当前场景的数据在后续场景中生成 mapView?谢谢。

【问题讨论】:

    标签: ios objective-c google-maps gmsmapview


    【解决方案1】:

    我认为您不应该在两个控制器之间传递 UI。您应该只将非 UI 数据传递给您的第二个控制器。特别是您的 UI 数据可能很弱,可能会变为 nil。此外,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 属性数据到您的第二个控制器中的强变量。

    【讨论】:

    • 谢谢,这就是我最终所做的(将相机坐标和标记信息传递到变量中,然后在下一个场景中创建具有相同属性的新对象)。当地图是我最大的内存消耗者时,我担心会为额外的地图占用额外的内存。事实证明,拥有一个新的地图视图实际上并没有显着增加内存。我想知道谷歌地图是否有某种内置优化,只创建一个地图视图,并在你交换屏幕时改变属性?
    • 我不认为两个谷歌地图视图对你的记忆力很不利,但如果你真的担心内存问题,你可以在你的第一个控制器中取消分配地图视图,看看这个答案:stackoverflow.com/a/16379401/4195406另外,为什么你需要在两个不同的控制器中使用两个谷歌地图视图而不是重新渲染你的地图视图?
    • 我是 obj-c/iOS 和 google maps sdk 的新手,所以如果有更好的方法,我只是不熟悉。基本上,我使用一个屏幕输入地址并转到该位置,然后当您转到下一个屏幕时,它会变成卫星视图,您可以在该位置周围添加一些点以在地图上标记点.输入地址栏消失,并出现一些新的用户界面按钮。如果您知道比传递位置坐标更好的方法,我会指出正确的方向。
    • 你可能想添加一个搜索按钮,当用户点击按钮时,它会显示搜索栏(搜索栏的alpha为1.0),当用户输入完地名后,搜索栏消失(将搜索栏的 alpha 设置为 0.0),然后将地图视图更改为卫星视图,将您的地图视图相机动画到该位置。这完全是您的设计决定,我只是向您展示一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多