[UIView setImage:]:初始化UISearchController时将无法识别的选择器发送到实例

Doa*_*ong 1 ios swift uisearchcontroller

我正在开发具有功能的iOS应用程序,该功能可用于UISearchController提供国家/地区列表的搜索功能。直到最新版本,一切正常。但是现在,在向应用程序中添加了一些新功能之后,我遇到了一个奇怪的错误,该错误导致应用程序崩溃。每当我尝试打电话时UISearchController(searchResultsController:nil),我的应用就会因故崩溃[UIView setImage:]: unrecognized selector sent to instance。我追溯了从先前发行版到现在的所有先前提交,但仍然没有找到罪魁祸首。我想就如何调试此问题提出建议,因为我无法调试进入UISearchController初始化本身。

注意:我没有提供一些代码段,因为我认为这没有必要,我尝试了几种方法,包括UISearchController(searchResultsController:nil)在其他地方调用,删除的使用UISearchController,删除了一些可疑的扩展...以确保swift不会给我带来另一个错误崩溃报告

编辑我的应用程序的目标版本是8.0,我在XCode 7.3.1,MacOS El Capitan上使用swift 2.2

编辑2我尝试切换到,[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];但不幸的是,出于相同的原因仍然崩溃。

编辑3来自Crashlytics的崩溃日志:

Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x181ec2db0 __exceptionPreprocess
1  libobjc.A.dylib                0x181527f80 objc_exception_throw
2  CoreFoundation                 0x181ec9c4c __methodDescriptionForSelector
3  CoreFoundation                 0x181ec6bec ___forwarding___
4  CoreFoundation                 0x181dc4c5c _CF_forwarding_prep_0
5  UIKit                          0x18710f9d0 -[UISearchBar(UISearchBarStatic) _updateMagnifyingGlassView]
6  UIKit                          0x18710d778 -[UISearchBar(UISearchBarStatic) _setupSearchField]
7  UIKit                          0x18719d2c8 -[UISearchBar searchField]
8  UIKit                          0x187114684 -[UISearchBar setPlaceholder:]
9  UIKit                          0x1879c0d3c -[UISearchController _commonInit]
10 UIKit                          0x1879c10cc -[UISearchController initWithSearchResultsController:]
11 EMCCountryPickerController     0x100bda6e8 -[EMCCountryPickerController loadView] (EMCCountryPickerController.m:136)
12 UIKit                          0x1870208ec -[UIViewController loadViewIfRequired]
13 UIKit                          0x187020844 -[UIViewController view]
14 UIKit                          0x18790f450 -[_UIFullscreenPresentationController _setPresentedViewController:]
15 UIKit                          0x18737cd90 -[UIPresentationController initWithPresentedViewController:presentingViewController:]
16 UIKit                          0x1873a2af4 -[UIViewController _presentViewController:withAnimationController:completion:]
17 UIKit                          0x1873a5890 -[UIViewController _performCoordinatedPresentOrDismiss:animated:]
18 UIKit                          0x18711b3cc -[UIViewController presentViewController:animated:completion:]
19 UIKit                          0x193c3084c -[UIViewControllerAccessibility presentViewController:animated:completion:]
20 bluebird-ios                   0x10012e244 CountryPicker.didTapOnView() -> () (CountryPicker.swift:132)
21 bluebird-ios                   0x10012e29c @objc CountryPicker.didTapOnView() -> () (CountryPicker.swift)
22 UIKit                          0x1875b1f30 _UIGestureRecognizerSendTargetActions
23 UIKit                          0x1871c6728 _UIGestureRecognizerSendActions
24 UIKit                          0x1870537a0 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:]
25 UIKit                          0x1875b3530 ___UIGestureRecognizerUpdate_block_invoke898
26 UIKit                          0x1870124d8 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks
27 UIKit                          0x18700f254 _UIGestureRecognizerUpdate
28 UIKit                          0x187051610 -[UIWindow _sendGesturesForEvent:]
29 UIKit                          0x187050c0c -[UIWindow sendEvent:]
30 UIKit                          0x18702104c -[UIApplication sendEvent:]
31 UIKit                          0x193c0545c -[UIApplicationAccessibility sendEvent:]
32 UIKit                          0x18701f628 _UIApplicationHandleEventQueue
33 CoreFoundation                 0x181e7909c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
34 CoreFoundation                 0x181e78b30 __CFRunLoopDoSources0
35 CoreFoundation                 0x181e76830 __CFRunLoopRun
36 CoreFoundation                 0x181da0c50 CFRunLoopRunSpecific
37 GraphicsServices               0x183688088 GSEventRunModal
38 UIKit                          0x18708a088 UIApplicationMain
39 bluebird-ios                   0x100225a3c main (AppDelegate.swift:13)
40 libdispatch.dylib              0x18193e8b8 (Missing)
Run Code Online (Sandbox Code Playgroud)

Doa*_*ong 5

问题解决了

根本原因是因为InitializeUISearchBar将调用,将_updateMagnifyingGlassView其设置为放大图像到其左视图UITextField。在我的代码中,我具有以下扩展名:

extension UITextField {
    @IBInspectable var paddingLeft: CGFloat {
        get {
            return self.leftView?.frame.width ?? 0
        } set {
            let paddingView   = UIView(frame: CGRectMake(0, 0, newValue, self.frame.height))
            self.leftView     = paddingView
            self.leftViewMode = .Always
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,该属性paddingLeft不是可选属性,这将导致将该属性UITextField设置0为默认值,因此将创建宽度为0的视图并leftView通过setter方法分配给该视图。如您在上面的崩溃日志中看到的那样,这会导致UISearchBar崩溃_updateMagnifyingGlassView

结论

使用扩展时要特别小心,尤其是当它会修改现有UIKit控件的默认行为时