[UIView setImage:]:在init UISearchController时发送到实例的无法识别的选择器

时间:2016-08-03 17:14:21

标签: ios swift uisearchcontroller

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

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

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

编辑2 我尝试切换到UISearchController但不幸的是,仍然因为同样的原因而崩溃。

编辑3 Crashlytics的崩溃日志:

[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

2 个答案:

答案 0 :(得分:4)

解决了问题

根本原因是因为在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
        }
    }
}

请注意,属性paddingLeft不是可选属性,这会导致UITextField0设置为此属性的默认值,从而创建宽度为0的视图并分配给leftView通过setter方法。这会导致UISearchBar在调用_updateMagnifyingGlassView时崩溃,如上面的崩溃日志中所示。

<强>结论

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

答案 1 :(得分:0)

您不能以这种方式直接将图像放在视图上。为此,请遵循此片段。

UIView *view=[[UIView alloc]initWithFrame:CGRectMake(x, y, width, height)];
[view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"imageName.png"]]];

或者您可能已经绘制了imageView的出口,但在Interface Builder中将您的观点配置为UIView,而不是UIImageView。您必须将其更改为UIImageView。崩溃与searchReslutController无关,您可能会错误地使用imageView