【问题标题】:GoogleMaps basic iOS demo app crash - unrecognized selector sent to instanceGoogleMaps 基本 iOS 演示应用程序崩溃 - 无法识别的选择器发送到实例
【发布时间】:2014-02-25 16:09:03
【问题描述】:

我正在尝试运行基本的 iOS 演示 SDK 代码。我已经创建了 API 密钥,它加载正常。 尽管我已将代码从 viewDidLoad 转移到 loadView,但效果仍然存在。见以下代码

-(void)loadView{
    // Create a GMSCameraPosition that tells the map to display the
    // coordinate -33.86,151.20 at zoom level 6.
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86
                                                        longitude:151.20
                                                             zoom:6];
    _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

    _mapView.myLocationEnabled = YES;
    self.view = _mapView;

    // Creates a marker in the center of the map.
    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20);
    marker.title = @"Sydney";
    marker.snippet = @"Australia";
    marker.map = _mapView;
}

相机已创建,但执行此行时

_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

抛出一个带有描述的 NSException -> -[GMSMapView animateToCameraPosition:]: unrecognized selector sent to instance。

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[GMSMapView animateToCameraPosition:]: 无法识别的选择器发送到实例 0x14dbb870' * 第一次抛出调用栈:(0x2f462f4b 0x39cd96af 0x2f4668e7 0x2f4651cb 0x2f3b44d8 0x4cebe9 0x4cd78f 0x4ccc41 0x4ccb3d 0x21ced5 0x31bda1bd 0x31bda139 0x1d4b27 0x1d4a83 0x1d51cd 0x31bda37b 0x31c850f1 0x31c85007 0x31c845e3 0x31c8430d 0x31c8407d 0x31c84015 0x31bd5da3 0x3185cc6b 0x3185847b 0x3185830d 0x31857d1f 0x31857b2f 0x31bce0c3 0x2f42e1cd 0x2f42bb71 0x2f42beb3 0x2f396c27 0x2f396a0b 0x34097283 0x31c3a049 0xf58b1 0x3a1e1ab7) libc++abi.dylib:终止于 NSException 类型的未捕获异常

【问题讨论】:

  • 如果将 CGRectZero 更改为带有框架的正确 CGRect 会发生什么?
  • 已经找到了解决方案(请看下面 -> 今天我会做标记)。不错的建议-没有任何运气就尝试过。同样的事情也发生了。 CGrectZero 在他们的示例中,所以我想可以使用。另一件事是,在文档示例中,他们在 ViewDidLoad 中将地图添加为 self.view,至于在示例中,地图被添加到 loadView 中(我猜它负责加载视图更好)。

标签: ios google-maps google-maps-sdk-ios


【解决方案1】:

我认为您可能忘记将类设为 GMSMapView 委托。 ()后面的GMSMapViewDelegate位需要在

之间

我没有分配该委托,就像 Google 的基本代码没有分配它一样。 我幸运地设法让它工作。谷歌地图上的谷歌文档说明如下:

选择您的项目,而不是特定目标,然后打开“构建设置”选项卡。 在其他链接器标志部分中,添加 -ObjC。如果这些设置不可见,请将 Build Settings 栏中的过滤器从 Basic 更改为 All。

但他们的示例项目,经过我的检查,在目标上设置了标志。在我的案例中将它设置在我的项目中的构建目标上会有所帮助,并且我发布的代码工作正常。

【讨论】:

  • 如果您已经错误地在目标而不是项目中添加标志,您应该确保目标没有空的覆盖值.. 例如。属性中的粗体字。如果是这样,您可以选择值并按 Delete 按钮。我将获取全局值并从项目中继承 -ObjC 标志。
【解决方案2】:

在你的项目中添加 -ObjC 去: 单击您的项目->目标->构建设置->搜索(其他链接器标志) ->设置(-ObjC) 参考截图:

【讨论】:

  • 将 -ObjC 添加到链接器标志是什么意思?我不再收到错误消息,Google Maps 也没有崩溃,现在加载得很好。我在输出中看到来自 Google 地图的升级消息。添加此标志是否只是为了捕获此消息?
  • @Ken 通过添加 -ObjC 您告诉链接器标志加载或获取特定库中的每个文件。所以,基本上它包括那些文件。
【解决方案3】:

您很可能忘记了这样做:(如 google 文档中所述)

选择您的项目,而不是特定目标,然后打开“构建设置”选项卡。 在其他链接器标志部分中,添加 -ObjC。如果这些设置不可见,请将 Build Settings 栏中的过滤器从 Basic 更改为 All。

【讨论】:

    【解决方案4】:

    我遇到了同样的错误,因为我错误地写成了 -objC 而不是 -ObjC(大写 O)

    如果它对某人有帮助

    【讨论】:

      【解决方案5】:

      请务必注意,您应该将 -ObjC 添加到项目的 Other Linker Flags 部分......而不是在您的特定目标中。

      【讨论】:

        【解决方案6】:

        其他人提到了 Google 文档中的以下部分

        选择您的项目,而不是特定目标,然后打开“构建设置”选项卡。在其他链接器标志部分中,添加 -ObjC。如果这些设置不可见,请将 Build Settings 栏中的过滤器从 Basic 更改为 All。

        但是,直到我将 -ObjC 标志添加到我的项目“其他链接器标志”部分,而不是目标“其他链接器标志”部分,我才能够解决无法识别的选择器错误。

        【讨论】:

          【解决方案7】:

          我认为您可能忘记将类设为 GMSMapView 委托。 ()后面的GMSMapViewDelegate位需要在

          之间
          @interface StructuredGeocoderViewController () GMSMapViewDelegate
          
          @end
          
          @implementation StructuredGeocoderViewController {
            GMSMapView *_mapView;
            GMSGeocoder *_geocoder;
          }
          
          - (void)viewDidLoad {
            [super viewDidLoad];
            GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
                                                                    longitude:151.2086
                                                                         zoom:12];
          
            _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
            _mapView.delegate = self;
          
            _geocoder = [[GMSGeocoder alloc] init];
          
            self.view = _mapView;
          }
          

          【讨论】:

            【解决方案8】:

            当你想提交到商店或试飞时,将标志 -ObjC 也放入发布中

            【讨论】:

              【解决方案9】:

              您只需进行少量修改。

              1. 将自定义 UIView 的类名指定为“GMSMapView”。
              2. 然后为你的班级提供一个出口。

                @IBOutlet var locationMapView: GMSMapView!

              3. 在 ViewDidLoad() 中添加以下代码。

                让 camera = GMSCameraPosition.camera(withLatitude: 10.1518, longitude: 76.3930, zoom: 6.0)

                self.locationMapView.camera = camera
                
                let initialLocation = CLLocationCoordinate2DMake(10.1518, 76.3930)
                 let marker = GMSMarker(position: initialLocation)
                 marker.title = "Kochi"
                 marker.snippet = "Kerala"
                 marker.map = locationMapView
                 marker.snippet = "Kerala"
                

              【讨论】:

                猜你喜欢
                • 2016-02-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-08-08
                • 2023-03-30
                • 1970-01-01
                相关资源
                最近更新 更多