【发布时间】:2017-01-10 02:27:14
【问题描述】:
我无法理解UIViewController 的视图属性如何调用viewDidLoad() 方法。这没有意义,但我想了解幕后发生的事情。我确信这在 Swift 编程指南中或者甚至在 Apple 的 UIViewController 参考指南中都有很好的解释,但现在太冗长而无法完全理解。如果在 Swift 编程指南中有解释,我不确定进一步研究它的正确术语或这个过程是如何工作的。也许计算属性?然而,从我对计算属性的了解中,计算属性会执行某种逻辑,以便将其变量设置为新值,甚至可能是初始值。困扰我的是理解属性如何在其类中调用函数的概念?尤其是UIViewController 中调用viewDidLoad 方法的视图属性。
这是我偶然发现的代码:
func test_OnViewDidLoad_tableViewIsSet(){
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "ItemListViewController")
let sut = viewController as! ItemListViewController
_ = sut.view
XCTAssertNotNil(sut.tableView)
}
这是我的子类 UIViewController:
import UIKit
class ItemListViewController: UIViewController {
var tableView: UITableView?
override func viewDidLoad() {
tableView = UITableView()
}
}
【问题讨论】:
-
阅读
UIViewController view、UIViewController loadView的文档。和UIViewController viewDidLoad,你就会知道这一切是如何运作的。 -
仅供参考-您的问题与 Swift 无关。它是
UIViewController类的函数,与使用的语言无关。 -
@rmaddy 谢谢你,我明白你在说什么,但是在阅读参考后它指出“如果你访问这个属性并且它的值当前是 nil,视图控制器会自动调用 loadView() 方法并返回结果视图。”。我很好奇我要研究什么来了解 Apple 是如何做到这一点的?我应该在线搜索什么来了解如何仅通过访问函数的一个属性来调用函数?
-
这只是属性的“getter”方法的实现。没有魔法。很多很多属性(包括您可能正确的任何属性)都可以做同样的事情。
-
@rmaddy 谢谢,我知道我们看不到 Apple 的 API,但你是说我可以创建一个返回函数的 getter 方法?即: var x: UIView { get { return viewDidLoad() } }
标签: ios swift uiviewcontroller xctest