查看控制器和自身
View Controller and self
我在看 Brian Voong 的教程
https://youtu.be/hexuJ6qL06I?t=1678
这一行有这部分代码 header.viewController = self.
我很难理解这里的这一行。有没有人可以解释 header.viewController = self 是什么意思?是为了把 viewController 放在 header 中,但那是什么意思?如果有人可以向我提供一些解释,我将不胜感激。我什至很难使用 google 找到此信息。根本不知道用什么关键词搜索
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
}
header
是单独的 class(TaskHeader) 的 object,它有一个可选的 属性 viewController
。当用户点击 header 的添加按钮时,它会调用 TaskHeader
class addTask
(headerView) 上的方法,最后调用 viewController.addNewTask方法。
所以他保留了这个,这样我们就可以轻松获得 viewController 引用,他可以通过该引用从 Taskheader Class 调用 viewController class 上的方法.您可以查看 TaskHeader class 以了解其工作原理。
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 = ""
}
}
header.viewContoller = self
'viewController'只是header的属性,代码让这个属性指针指向self,self是当前控制器。
然后在你的header中,你可以使用:
self.viewController.view.backgroundColor = UIColor.orangeColor
并且当前控制器的背景会发生变化
我在看 Brian Voong 的教程 https://youtu.be/hexuJ6qL06I?t=1678
这一行有这部分代码 header.viewController = self.
我很难理解这里的这一行。有没有人可以解释 header.viewController = self 是什么意思?是为了把 viewController 放在 header 中,但那是什么意思?如果有人可以向我提供一些解释,我将不胜感激。我什至很难使用 google 找到此信息。根本不知道用什么关键词搜索
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
}
header
是单独的 class(TaskHeader) 的 object,它有一个可选的 属性 viewController
。当用户点击 header 的添加按钮时,它会调用 TaskHeader
class addTask
(headerView) 上的方法,最后调用 viewController.addNewTask方法。
所以他保留了这个,这样我们就可以轻松获得 viewController 引用,他可以通过该引用从 Taskheader Class 调用 viewController class 上的方法.您可以查看 TaskHeader class 以了解其工作原理。
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 = ""
}
}
header.viewContoller = self
'viewController'只是header的属性,代码让这个属性指针指向self,self是当前控制器。
然后在你的header中,你可以使用:
self.viewController.view.backgroundColor = UIColor.orangeColor
并且当前控制器的背景会发生变化