我们是否必须在ViewDidLoad中或在UIViewController中的viewDidLoad之外初始化属性?

时间:2018-01-21 14:32:20

标签: ios swift uiviewcontroller

我在UIViewController类创建时读了一篇文章说属性需要为nil ,然后在调用viewDidLoad时将它添加到value中。

它表示在构造对象时也无法初始化属性。

根据文章,它将如下所示 请注意,它不是故事板中的自定义按钮。

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创建时它需要为nil。所以我必须在viewDidLoad中声明itemArray或者它可以吗?我很困惑。

1 个答案:

答案 0 :(得分:0)

没有更多的背景,文章是错误的。您显然可以将内联属性初始化,就像您展示的示例一样。如果您希望我解释文章说明的原因,您应该包含文章的链接。

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

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