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
相关产品推荐
相关产品推荐

