查看控制器和自我

时间:2016-05-05 11:05:51

标签: ios swift viewcontroller self

我正在看Brian Voong的教程 https://youtu.be/hexuJ6qL06I?t=1678

代码的这一部分有这一行header.viewController = self。

我很难理解这条特殊的路线。有没有人可以解释header.viewController = self的含义?它是用于将viewController放在标题中,但这是什么意思?如果有人能给我一些解释,我将不胜感激。我甚至很难使用谷歌查找此信息。我根本不知道用于搜索的关键字。

override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    let header = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "headerId", forIndexPath: indexPath) as! TaskHeader

    header.viewContoller = self

    return header

}

2 个答案:

答案 0 :(得分:1)

header是单独类(TaskHeader)的对象,它具有可选属性viewController。当用户点击标题的Add按钮时,它会调用TaskHeaderaddTask(headerView)上的方法,该方法最后会调用viewController.addNewTask方法。

所以他保留了这个,所以我们可以很容易地获得viewController引用,通过它可以从Taskheader类调用viewController类的方法。您可以查看TaskHeader类以了解它的工作原理。

class TaskHeader: BaseCell {

    var viewController: ViewController?

    let taskNameTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Enter Task Name"
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.borderStyle = .RoundedRect
        return textField
    }()

    let addTaskButton: UIButton = {
        let button = UIButton(type: .System)
        button.setTitle("Add Task", forState: .Normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    override func setupViews() {

        addSubview(taskNameTextField)
        addSubview(addTaskButton)

        addTaskButton.addTarget(self, action: "addTask", forControlEvents: .TouchUpInside)

        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-8-[v0]-[v1(80)]-8-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": taskNameTextField, "v1": addTaskButton]))

        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-24-[v0]-24-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": taskNameTextField]))
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[v0]-8-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": addTaskButton]))
    }

    func addTask() {
        viewController?.addNewTask(taskNameTextField.text!)
        taskNameTextField.text = ""
    }

}

答案 1 :(得分:1)

header.viewContoller = self

'viewController'只是header的一个属性,代码使这个属性指向self,self是当前控制器。

然后在标题中,您可以使用:

self.viewController.view.backgroundColor = UIColor.orangeColor

当前控制器的背景将会改变。