[英]Swift app crashes with `unrecognized selector sent to instance` on CLLocationManager
与 StackOverflow 上的许多其他问题类似,在运行我的应用程序时,我收到一个unrecognized selector sent to instance
错误。 让我的案例与众不同的(我认为)是它是用 Swift 编写的,常见的原因不是这里的原因。
在这个问题中,解决方案是在身份检查器中将该视图的“自定义类”设置为响应类。 我检查了这个,情况就是这样(请注意,我确实在某个时候重命名了类,但现在它肯定被设置为“ViewController”)。
我包括下面的堆栈跟踪以及ViewController.swift
的代码。 您还可以在此处找到所有代码。 我通过重新开始设法避免了这个问题,这使我能够解决我之前的问题。 这个新的试验可以在这个分支中找到。 但是,我想知道出了什么问题并解决这个问题。
我无法成功回答的一个问题是CLLocationManagerDelegate
是否需要一些必需的方法? 但是因为我让它在另一个分支工作,我怀疑它没有必要。
2014-07-03 21:50:26.056 RowingTracker2[11416:60b] -[CLLocationManager requestWhenInUseAuthorization]: unrecognized selector sent to instance 0xa10c4a0
2014-07-03 21:50:26.059 RowingTracker2[11416:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CLLocationManager requestWhenInUseAuthorization]: unrecognized selector sent to instance 0xa10c4a0'
*** First throw call stack:
(
0 CoreFoundation 0x008831e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01e2a8e5 objc_exception_throw + 44
2 CoreFoundation 0x00920243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x0087350b ___forwarding___ + 1019
4 CoreFoundation 0x008730ee _CF_forwarding_prep_0 + 14
5 RowingTracker2 0x00003352 _TFC14RowingTracker214ViewController11viewDidLoadfS0_FT_T_ + 738
6 RowingTracker2 0x000033a2 _TToFC14RowingTracker214ViewController11viewDidLoadfS0_FT_T_ + 34
7 UIKit 0x0102f33d -[UIViewController loadViewIfRequired] + 696
8 UIKit 0x0102f5d9 -[UIViewController view] + 35
9 UIKit 0x00f4f267 -[UIWindow addRootViewControllerViewIfPossible] + 66
10 UIKit 0x00f4f5ef -[UIWindow _setHidden:forced:] + 312
11 UIKit 0x00f4f86b -[UIWindow _orderFrontWithoutMakingKey] + 49
12 UIKit 0x00f5a3c8 -[UIWindow makeKeyAndVisible] + 65
13 UIKit 0x00f0abc0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 2097
14 UIKit 0x00f0f667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
15 UIKit 0x00f23f92 -[UIApplication handleEvent:withNewEvent:] + 3517
16 UIKit 0x00f24555 -[UIApplication sendEvent:] + 85
17 UIKit 0x00f11250 _UIApplicationHandleEvent + 683
18 GraphicsServices 0x031fff02 _PurpleEventCallback + 776
19 GraphicsServices 0x031ffa0d PurpleEventCallback + 46
20 CoreFoundation 0x007feca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
21 CoreFoundation 0x007fe9db __CFRunLoopDoSource1 + 523
22 CoreFoundation 0x0082968c __CFRunLoopRun + 2156
23 CoreFoundation 0x008289d3 CFRunLoopRunSpecific + 467
24 CoreFoundation 0x008287eb CFRunLoopRunInMode + 123
25 UIKit 0x00f0ed9c -[UIApplication _run] + 840
26 UIKit 0x00f10f9b UIApplicationMain + 1225
27 RowingTracker2 0x00008021 top_level_code + 97
28 RowingTracker2 0x0000805b main + 43
29 libdyld.dylib 0x024ff701 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
视图控制器.swift
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet var mapview: MKMapView = nil
var locationmgr : CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
locationmgr = CLLocationManager()
locationmgr.delegate = self
locationmgr.requestWhenInUseAuthorization() ///< Offending line.
// mapview.showsUserLocation = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
由于requestWhenInUseAuthorization
方法仅适用于iOS 8(根据Apple文档 ),您必须将其包装:
SWIFT代码:
if (locationmgr.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
locationmgr.requestWhenInUseAuthorization()
}
Objective-C也是如此:
if ([locationmgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[locationmgr requestWhenInUseAuthorization];
}
此代码不能在iOS 7及更低版本上运行 - 根据文档, requestWhenInUseAuthorization
仅适用于iOS 8:
可用性:
适用于iOS 8.0及更高版本。
这是我用来支持iOS 7中的新核心位置方法而没有错误:
SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([locationManager respondsToSelector:requestSelector]) {
[locationManager performSelector:requestSelector withObject:NULL];
}
同样,如果您看到与CLLocationManager
相关的此错误,请检查您是否尝试在 iOS14 之前的 iOS 版本上使用authorizationStatus
属性。
https://developer.apple.com/documentation/corelocation/cllocationmanager/3563952-authorizationstatus
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.