You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 13中使用valueForKey:@"_searchField"修改UISearchBar崩溃的解决方法

解决iOS 13中UISearchBar的TextField修改崩溃问题

最近在iOS 13版本里尝试修改UISearchBar内部的TextField时踩了个坑:直接用valueForKey:@"_searchField"获取TextField会导致崩溃,显然Apple在这个版本里对私有API的访问做了限制。

后来我写了一个UIView的子类,实现了递归查找子视图的方法,目前用起来很稳定,分享给大家:

Objective-C 实现

先给UIView子类添加这个自定义查找方法:

- (UIView *)findSubview:(NSString *)name recursion:(BOOL)recursion {
    Class class = NSClassFromString(name);
    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:class]) {
            return subview;
        }
    }
    if (recursion) {
        for (UIView *subview in self.subviews) {
            UIView *tempView = [subview findSubview:name recursion:recursion];
            if (tempView) {
                return tempView;
            }
        }
    }
    return nil;
}

调用方式很简单,这样就能拿到UISearchBar里的TextField并修改属性了:

UITextField *textField = (UITextField*)[self findSubview:@"UITextField" recursion:YES];
// 这里就可以自由修改TextField属性,比如 textField.textColor = [UIColor redColor];

Swift 对应实现

如果是Swift开发,我补充了对应的UIView扩展实现:

extension UIView {
    func findSubview(named className: String, recursion: Bool) -> UIView? {
        guard let targetClass = NSClassFromString(className) as? UIView.Type else {
            return nil
        }
        for subview in subviews {
            if subview.isKind(of: targetClass) {
                return subview
            }
        }
        if recursion {
            for subview in subviews {
                if let foundView = subview.findSubview(named: className, recursion: recursion) {
                    return foundView
                }
            }
        }
        return nil
    }
}

调用示例:

if let textField = searchBar.findSubview(named: "UITextField", recursion: true) as? UITextField {
    // 比如修改文字颜色:textField.textColor = .red
}

祝各位编码愉快!

内容的提问来源于stack exchange,提问作者Filippo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:27:06