尝试在我的应用程序中打开苹果地图应用程序时发送到实例的无法识别的选择器

Unrecognized selector sent to instance while trying to open apple maps app in my app

我试图在我创建的地图中打开 apple 地图,但在这样做的过程中我收到一条错误消息 "unrecognized selector send to instance"。我正在使用 arc,所以应该没有内存管理问题。这是我在 viewDidLoad 中编写的代码。我创建了一个按钮并为其添加了一个选择器..

UIButton *appleMapsButton = [[UIButton alloc] init];
appleMapsButton.frame = CGRectMake(100, 100, 200, 200);
appleMapsButton.backgroundColor = [UIColor redColor];
[appleMapsButton addTarget:self action:@selector(appleMapsClicked:) forControlEvents:UIControlEventTouchUpInside];
[mapView addSubview:appleMapsButton];

操作方法如下:

-(void)appleMapsClicked{

CLLocationCoordinate2D endingCoord = CLLocationCoordinate2DMake(lat, lng);
MKPlacemark *endLocation = [[MKPlacemark alloc] initWithCoordinate:endingCoord addressDictionary:nil];
MKMapItem *endingItem = [[MKMapItem alloc] initWithPlacemark:endLocation];

NSMutableDictionary *launchOptions = [[NSMutableDictionary alloc] init];
[launchOptions setObject:MKLaunchOptionsDirectionsModeDriving forKey:MKLaunchOptionsDirectionsModeKey];

[endingItem openInMapsWithLaunchOptions:launchOptions];
}

这是我在调试器区域遇到的错误:

-[MapViewController appleMapsClicked:]: 无法识别的选择器发送到实例 0x176564d0 2016-04-15 16:10:39.394 Restaurant[1081:220822] *** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[MapViewController appleMapsClicked:]:无法识别的选择器发送到实例 0x176564d0'

找到解决方案:

当您添加一个方法作为选择器并且该方法没有参数时,不要像这样在方法旁边放置冒号:

(mySelector:)

通过排除冒号,应用程序没有崩溃。

您正在使用方法 appleMapsClicked: 注册接收消息,但您的方法没有参数。

删除 :,或将方法签名更改为 -(void)appleMapsClicked:(id)sender 应该可以修复它。

解决方案:

  1. 将方法-(void)appleMapsClicked改为-(void)appleMapsClicked:(UIButton *)sender

  2. 将选择器 @selector(appleMapsClicked:) 的名称更改为 @selector(appleMapsClicked)

您可以选择任何一种解决方案

我经常遇到这种情况。清除这个假设为 "not to happen in the the first place" 的错误的最佳方法是:

1) 删除你的 UIButton 和 IBOutlet 2) 再次创建一个新的 UIButton 并重新连接到 ViewController.

要查明这是否是问题所在,请删除按钮函数和 运行 中的所有代码。如果你按下按钮仍然出错,那么你只需要创建一个新按钮。

这可能是某些人的解决方案。

您可能重命名或删除了在 MapViewController 上调用 appleMapsClicked 的按钮。

同样的事情发生在我身上,但我无法通过常规方法修复它,(右键单击按钮并从 UI 中删除方法引用)

然后我可以通过使用外部编辑器打开 Main.StoryBoard 来解决问题(右键单击 Main.StoryBoard,然后单击 "open using an external editor")。

它将以 XML 文件的形式打开故事板。在编辑器中,在 MapViewController 节点下搜索 "appleMapsClicked"。您可能会发现的第一件事是对不再存在的方法 (appleMapsClicked) 的引用。删除该行并再次 运行。

这听起来可能是一个令人讨厌的解决方案,因为您不应该使用 Xcode 来处理自动生成的文件,但这是我唯一的出路。

希望对您有所帮助。