作者:猪猪寂寞的王子_125 | 来源:互联网 | 2022-10-20 15:51
在Xcode-11-Beta(ios13)之前,以下代码用于自定义searchbar值以获取使key正常工作的键值。现在低于崩溃日志。
'NSGenericException',原因:'禁止访问UISearchBar的_searchField ivar。这是一个应用程序错误”
- (UITextField *)textField
{
return [self valueForKey:@"_searchField"];
}
任何帮助表示赞赏。
1> Jordan H..:
SDK现在提供了,UISearchBar.searchTextField
因此您可以简单地用公共API替换私有API的实现。
searchBar.searchTextField.backgroundColor = [UIColor blueColor];
如果您需要支持早期的iOS版本,请将其包装在`if #available(iOS 13.0,*){}中。在为iOS 13构建时,您将无法使用旧版本的Xcode。
2> 小智..:
我遇到了同样的崩溃,使用IOS 13,您不再需要.value(forKey :)
这是导致崩溃的行:
if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
解决方法是:
let searchField = searchController.searchBar.searchTextField
3> Rajan Mahesh..:
如果我们希望在使用Xcode 11编译时也支持iOS 12和更早版本,则可以扩展UISearchBar
获取文本字段的位置
extension UISearchBar {
var textField : UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
} else {
// Fallback on earlier versions
for view : UIView in (self.subviews[0]).subviews {
if let textField = view as? UITextField {
return textField
}
}
}
return nil
}
}
用法
searchBar.textField?.fOnt= UIFont.systemFont(ofSize: 15.0)
在这里,我们可以访问所有textField的属性,并根据需要修改 UISearchBar
视图层次结构有所变化。因此,通过印刷self.subviews[0]).subviews
,其中self
在UISearchBar
对于iOS 12及更早版本
对于iOS 13+
随着UISearchBarBackground
,现在我们已经UISearchBarSearchContainerView
和UISearchBarScopeContainerView
而UISearchBarTextField
缺少它是由苹果公司提供的一种延长更换UISearchTextField
类
extension UISearchBar {
open var searchTextField: UISearchTextField { get }
}
因此,我们可以直接searchBar.searchTextField
在iOS 13及更高版本的设备中访问,而如果我们尝试在iOS 12及更低版本的OS设备中访问此属性,则会导致崩溃。
崩溃将是这样的:
[UISearchBar searchTextField]:无法识别的选择器已发送到实例
下面是苹果文档此
当iOS部署目标设置为<13.0时,为什么Xcode编译器不会发出警告?当使用部署目标版本上不可用的API时,通常不会发生这种情况吗?那不是预编译器的必不可少的工作吗?
4> 小智..:
它对我来说仍然可以使用键“ searchField”而不带下划线。迅捷5
guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }