Swift 4.2 迁移后发送到实例的无法识别的选择器
unrecognized selector sent to instance after Swift 4.2 migration
我刚刚将我的项目从 Swift 3.0 迁移到 Swift 4.2,但我开始收到此错误。
多个 classes 正在调用相同的方法,但只有一个抛出异常。在 Swift 迁移期间,单个 class 中可能发生的更改可能导致此问题的任何想法?
2020-03-04 09:53:42.552405-0500 Lake Observer[13974:1234549]
-[Lake_Observer.LocationChangeController reusablePickerViewController:didChooseValue:forCtrl:]: unrecognized
selector sent to instance 0x1040ca800 2020-03-04 09:53:42.554410-0500
Lake Observer[13974:1234549] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason:
'-[Lake_Observer.LocationChangeController
reusablePickerViewController:didChooseValue:forCtrl:]: unrecognized
selector sent to instance 0x1040ca800'
这是异常发生的地方。 (RecorderReusablePicker)
- (void) buttonIsPressed:(UIButton *)paramSender{
NSMutableArray *retArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for (int i = 0; i < array.count; i++) {
[retArray addObject:[NSNumber numberWithInteger:[genericPicker selectedRowInComponent:i]]];
}
[callingReference reusablePickerViewController:self didChooseValue:[[RecorderReusableResult alloc] initWithArray:retArray clearValue:NO] forCtrl:callingControlReference];
}
这里创建了选择器。 (位置变化控制器)
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == editTextWaterBody) {
let waterbodyArray: NSArray? = NSArray(objects: waterbodyNames)
self.view.window?.rootViewController?.present(RecorderReusablePicker (dataArray: waterbodyArray as? [Any], widthArray: nil, inInitialIndexArray: [savedWaterbodyIndex], reference: self, andControlRef: editTextWaterBody, andTitle: "Please select your waterbody", showSelection: true, allowPanZoom: false), animated: true, completion: nil)
return false
}
return true
}
以及从选择器 returning 时的方法。
func reusablePickerViewController(_ reusablePickerViewController: RecorderReusablePicker!, didChooseValue retVal: RecorderReusableResult!, forCtrl outCtrl: Any!) {
reusablePickerViewController.dismiss(animated: true, completion: nil)
}
同样,还有其他 class 具有完全相同的创建方法和 return 来自选择器的方法,但只有一个导致异常。
改变
func reusablePickerViewController
到
@objc func reusablePickerViewController
从 Swift 3 到 Swift 4.2 的迁移改变了实例成员如何暴露给 Objective-C 的规则。在 Swift 3 中,它们默认公开。在 Swift 4.2 中,您必须显式公开它们;否则,Objective-C 看不到它们——这正是你正在发生的事情。该方法在那里,但 Objective-C 认为它不存在,因此它因无法识别的选择器异常而崩溃。
我刚刚将我的项目从 Swift 3.0 迁移到 Swift 4.2,但我开始收到此错误。
多个 classes 正在调用相同的方法,但只有一个抛出异常。在 Swift 迁移期间,单个 class 中可能发生的更改可能导致此问题的任何想法?
2020-03-04 09:53:42.552405-0500 Lake Observer[13974:1234549] -[Lake_Observer.LocationChangeController reusablePickerViewController:didChooseValue:forCtrl:]: unrecognized selector sent to instance 0x1040ca800 2020-03-04 09:53:42.554410-0500 Lake Observer[13974:1234549] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Lake_Observer.LocationChangeController reusablePickerViewController:didChooseValue:forCtrl:]: unrecognized selector sent to instance 0x1040ca800'
这是异常发生的地方。 (RecorderReusablePicker)
- (void) buttonIsPressed:(UIButton *)paramSender{
NSMutableArray *retArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for (int i = 0; i < array.count; i++) {
[retArray addObject:[NSNumber numberWithInteger:[genericPicker selectedRowInComponent:i]]];
}
[callingReference reusablePickerViewController:self didChooseValue:[[RecorderReusableResult alloc] initWithArray:retArray clearValue:NO] forCtrl:callingControlReference];
}
这里创建了选择器。 (位置变化控制器)
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == editTextWaterBody) {
let waterbodyArray: NSArray? = NSArray(objects: waterbodyNames)
self.view.window?.rootViewController?.present(RecorderReusablePicker (dataArray: waterbodyArray as? [Any], widthArray: nil, inInitialIndexArray: [savedWaterbodyIndex], reference: self, andControlRef: editTextWaterBody, andTitle: "Please select your waterbody", showSelection: true, allowPanZoom: false), animated: true, completion: nil)
return false
}
return true
}
以及从选择器 returning 时的方法。
func reusablePickerViewController(_ reusablePickerViewController: RecorderReusablePicker!, didChooseValue retVal: RecorderReusableResult!, forCtrl outCtrl: Any!) {
reusablePickerViewController.dismiss(animated: true, completion: nil)
}
同样,还有其他 class 具有完全相同的创建方法和 return 来自选择器的方法,但只有一个导致异常。
改变
func reusablePickerViewController
到
@objc func reusablePickerViewController
从 Swift 3 到 Swift 4.2 的迁移改变了实例成员如何暴露给 Objective-C 的规则。在 Swift 3 中,它们默认公开。在 Swift 4.2 中,您必须显式公开它们;否则,Objective-C 看不到它们——这正是你正在发生的事情。该方法在那里,但 Objective-C 认为它不存在,因此它因无法识别的选择器异常而崩溃。