我们是否必须在 viewDidLoad 中初始化属性,或者在 UIViewController 中的 viewDidLo



我读到一篇文章说,当UIViewController类创建时,属性需要为零,然后是情节提要,或者在调用viewDidLoad时将其添加到值中。

它说在构造对象时也不能初始化属性。

根据文章,如下所示请注意,它是自定义按钮,而不是来自情节提要。

class BetterViewController: UIViewController {
    var myButton: UIButton!
override func viewDidLoad() {
        super.viewDidLoad()
        myButton = UIButton() // I set value to myButton.
       let anotherVariable = myButton.method // whatever method 
}

上面,myButton首先是nil类型,然后在viewDidLoad时为它设置了一个值。到目前为止一切都很好。但是我看到很多代码,如下所示

class ToDoListVewController: UITableViewController {
    let defaults = UserDefaults.standard  
    var itemArray = [Item]() // 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if let items = defaults.array(forKey: "ToDoListArray") as? [String]{
            itemArray = items
        }
    }

上面的例子,itemArray 不是 nil。但是当UITableViewController创建时,它需要为零。所以我必须在视图内声明 itemArray DidLoad 或者没问题?我很困惑。

没有更多的上下文,这篇文章是错误的。显然,您可以像您显示的示例一样内联初始化属性。如果你想让我解释为什么这篇文章这么说,你应该包括一个指向文章的链接。

通常,我们希望将属性设置为nil,并在属性的初始化需要使用selfviewDidLoad初始化它。手势识别器就是一个很好的例子。我们不能这样做:

let myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)

因为使用了self。到上述执行时,self可能尚未正确构造,因此编译器禁止此类操作。因此,我们只能将其设置为零:

var myGestureRecognizer: UITapGestureRecognizer!

并在viewDidLoad中初始化它:

myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)

另一方面,如果属性的初始化不需要构造self,则可以内联初始化它。例如,如果要跟踪用户点击按钮的次数:

// Without doubt, this will be 0 at the start
var buttonPressedCount = 0

相关内容

最新更新