我开发的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];
答案 0 :(得分:4)
解决了问题
根本原因是因为在Initialize
,UISearchBar
会调用_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
不是可选属性,这会导致UITextField
将0
设置为此属性的默认值,从而创建宽度为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
。