【问题标题】:How does the view property call the viewDidLoad function?视图属性如何调用 viewDidLoad 函数?
【发布时间】: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 viewUIViewController loadView 的文档。和UIViewController viewDidLoad,你就会知道这一切是如何运作的。
  • 仅供参考-您的问题与 Swift 无关。它是UIViewController 类的函数,与使用的语言无关。
  • @rmaddy 谢谢你,我明白你在说什么,但是在阅读参考后它指出“如果你访问这个属性并且它的值当前是 nil,视图控制器会自动调用 loadView() 方法并返回结果视图。”。我很好奇我要研究什么来了解 Apple 是如何做到这一点的?我应该在线搜索什么来了解如何仅通过访问函数的一个属性来调用函数?
  • 这只是属性的“getter”方法的实现。没有魔法。很多很多属性(包括您可能正确的任何属性)都可以做同样的事情。
  • @rmaddy 谢谢,我知道我们看不到 Apple 的 API,但你是说我可以创建一个返回函数的 getter 方法?即: var x: UIView { get { return viewDidLoad() } }

标签: ios swift uiviewcontroller xctest


【解决方案1】:

这是可能发生的事情的粗略概述(我们没有 UIViewController 的源代码(用 Objective-C 编写))。

class UIViewController: UIResponder {
    private var _view: UIView!

    var view: UIView! {
        get {
            if _view == nil {
                loadView()
                if _view != nil {
                    viewDidLoad()
                }
            }

            return _view
        }
        set {
            _view = newValue
        }
    }
}

我确信还有更多内容,但这应该让您大致了解 loadViewviewDidLoad 最终是如何通过访问 view 属性而被调用的。

【讨论】:

  • 这太有趣了,正是我需要看到的,才能通过 view 属性完全掌握这个概念。这更有意义,现在我对使用 getter/setter 属性的可能性更有信心。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多