无法在计算属性中为UISearchBar设置代理的问题咨询
为什么在UISearchBar的闭包初始化中设置delegate会报错?
错误原因
- 你用的是立即执行的闭包初始化属性,这个闭包会在
CollectionViewController实例完成初始化之前就运行。此时的self并不是一个完整的视图控制器实例,它的类型是(CollectionViewController) -> () -> CollectionViewController——本质是未完成初始化的构造器引用,和UISearchBarDelegate要求的已初始化实例类型不匹配,所以编译报错。 - 而
viewDidLoad()是视图控制器实例完全初始化、视图加载完成后才触发的生命周期方法,这时self已经是一个符合UISearchBarDelegate协议的完整实例,自然能正常设置代理。
解决办法
方法1:改用懒加载属性
把属性改成lazy,闭包会在第一次访问这个属性时才执行,此时实例已经初始化完成:
@usesAutoLayout lazy var imageSearchbar: UISearchBar = { let bar = UISearchBar() bar.delegate = self bar.searchBarStyle = .minimal bar.searchTextField.backgroundColor = .white return bar }()
方法2:在viewDidLoad中设置代理
如果需要属性立即初始化,就把依赖self的代理设置放到viewDidLoad()里:
@usesAutoLayout var imageSearchbar: UISearchBar = { let bar = UISearchBar() bar.searchBarStyle = .minimal bar.searchTextField.backgroundColor = .white return bar }() override func viewDidLoad() { super.viewDidLoad() imageSearchbar.delegate = self }
内容的提问来源于stack exchange,提问作者Ashutosh Mane
相关产品推荐
相关产品推荐

