iOS 13-使用UISearchBar _searchField的自定义SearchBar无法正常工作

Pra*_*dha 28 objective-c uisearchbar ios13 xcode11

在Xcode-11-Beta(ios13)之前,以下代码用于自定义searchbar值以获取使key正常工作的键值。现在低于崩溃日志。

'NSGenericException',原因:'禁止访问UISearchBar的_searchField ivar。这是一个应用程序错误”

- (UITextField *)textField
{
 return [self valueForKey:@"_searchField"];
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

Jor*_*n H 51

SDK现在提供了,UISearchBar.searchTextField因此您可以简单地用公共API替换私有API的实现。

searchBar.searchTextField.backgroundColor = [UIColor blueColor];
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要支持早期的iOS版本,请将其包装在`if #available(iOS 13.0,*){}中。在为iOS 13构建时,您将无法使用旧版本的Xcode。 (5认同)

小智 11

我遇到了同样的崩溃,使用IOS 13,您不再需要.value(forKey :)

这是导致崩溃的行:

if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
Run Code Online (Sandbox Code Playgroud)

解决方法是:

let searchField = searchController.searchBar.searchTextField
Run Code Online (Sandbox Code Playgroud)


Tej*_*jas 8

做这个:

 var searchTextField: UITextField?
    if #available(iOS 13.0, *) {
        searchTextField = searchBar.searchTextField
    } else {
        if let searchField = searchBar.value(forKey: "searchField") as? UITextField {
            searchTextField = searchField
        }
    }
Run Code Online (Sandbox Code Playgroud)

这将根据版本检查为您提供适当的搜索栏文本字段。


Raj*_*ari 6

如果我们希望在使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

searchBar.textField?.font = UIFont.systemFont(ofSize: 15.0)
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以访问所有textField的属性,并根据需要修改 UISearchBar

视图层次结构有所变化。因此,通过印刷self.subviews[0]).subviews,其中selfUISearchBar


对于iOS 12及更早版本

在此处输入图片说明

对于iOS 13+

在此处输入图片说明

随着UISearchBarBackground,现在我们已经UISearchBarSearchContainerViewUISearchBarScopeContainerViewUISearchBarTextField缺少它是由苹果公司提供的一种延长更换UISearchTextField

extension UISearchBar {


    open var searchTextField: UISearchTextField { get }
}
Run Code Online (Sandbox Code Playgroud)

因此,我们可以直接searchBar.searchTextField在iOS 13及更高版本的设备中访问,而如果我们尝试在iOS 12及更低版本的OS设备中访问此属性,则会导致崩溃。

崩溃将是这样的:

[UISearchBar searchTextField]:无法识别的选择器已发送到实例

在此处输入图片说明

下面是苹果文档

  • 当iOS部署目标设置为<13.0时,为什么Xcode编译器不会发出警告?当使用部署目标版本上不可用的API时,通常不会发生这种情况吗?那不是预编译器的必不可少的工作吗? (3认同)

小智 5

它对我来说仍然可以使用键“ searchField”而不带下划线。迅捷5

guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }
Run Code Online (Sandbox Code Playgroud)