gpt4 book ai didi

ios - 如何在 Swift 中使用 @IBOutlet 属性正确实现惰性实例化

转载 作者:搜寻专家 更新时间:2023-10-31 08:11:03 24 4
gpt4 key购买 nike

我正在通过 Big Nerd Ranch 的最新 iOS 书籍学习 iOS 开发。我选择在 Swift 中实现他们的应用程序。在他们的一个应用程序中,他们在 Objective C 中有以下代码:

- (UIView *)headerView
{
// If you have not loaded the header view yet...
if (!_headerView) {

// Load HeaderView.xib
[[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil]
}

return _headerView;
}

Apple 关于“@IBOutlet”的 Swift 指南:

When you declare an outlet in Swift, the compiler automatically converts the type to a weak implicitly unwrapped optional and assigns it an initial value of nil. In effect, the compiler replaces @IBOutlet var name: Type with @IBOutlet weak var name: Type! = nil.

正如在 Lazy loading Properties in swift 中指出的那样, 有几个不同的选项。在那篇文章中,他们都没有明确提到使用@IBOutlet 进行延迟初始化,因此我已尽最大努力实现他们的建议,并且想知道什么是最佳实践。

尝试 #1(失败):遵循类似的模式,如 AppDelegate.swift 中的示例。这带来了问题“'IBOutlet' 属性要求属性可变”

@IBOutlet var headerView : UIView  {
// If the HeaderView has not been loaded yet...
if !_headerView {
// Load HeaderView.xib
NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)
}
return _headerView!
}
var _headerView : UIView? = nil

尝试 #2(失败):将“@lazy”的任何变体与“@IBOutlet”一起使用都不起作用,因为“@lazy”需要一个初始化程序,但如果使用闭包,则“@IBOutlet”具有与尝试 #1 相同的问题

尝试#3(成功?):这是我能够让它工作的唯一方法。我从一个有点不同的问题中得到了这个想法,Lazy property initialization in Swift .我对正在发生的事情的理解是 headerView 实际上被声明为“@IBOutlet weak var headerView:UIView!= nil”,只会用我拥有的 TableViewController 子类初始化一次,并且初始化将是“惰性”的,因为它只发生当需要加载 TableViewController 时。

@IBOutlet var headerView : UIView

func loadHeaderView() {
// If the HeaderView has not been loaded yet...
if !headerView {
// Load HeaderView.xib
println("loaded HeaderView")
NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)
}
}

override func viewDidLoad() {
super.viewDidLoad()
loadHeaderView()
tableView.tableHeaderView = headerView
}

那么,如何改进呢?

viewDidLoad() 是正确的函数吗?

谢谢

最佳答案

延迟加载的 socket 没有意义 - 如果它是 socket ,它会在加载 Nib 时填充,而不是从代码中填充。如果你从代码中加载它,它不需要是一个导出,所以你可以使用@lazy。

关于ios - 如何在 Swift 中使用 @IBOutlet 属性正确实现惰性实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com