热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS13-使用UISearchBar_searchField的自定义SearchBar无法正常工作

如何解决《iOS13-使用UISearchBar_searchField的自定义SearchBar无法正常工作》经验,为你挑选了4个好方法。

在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,其中selfUISearchBar


对于iOS 12及更早版本

对于iOS 13+

随着UISearchBarBackground,现在我们已经UISearchBarSearchContainerViewUISearchBarScopeContainerViewUISearchBarTextField缺少它是由苹果公司提供的一种延长更换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 }


推荐阅读
author-avatar
猪猪寂寞的王子_125
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有