【发布时间】:2021-09-03 01:15:54
【问题描述】:
我有以下课程
CalendarViewController.swift
import UIKit
class CalendarViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
我有CalendarViewController.xib,文件所有者自定义类是CalendarViewController。
基于https://stackoverflow.com/a/55801259/72437
我想如果我想从 XIB 创建视图控制器,我需要执行
extension UIViewController {
static func instanceFromNib() -> Self {
func instantiateFromNib<T: UIViewController>() -> T {
return T.init(nibName: String(describing: T.self), bundle: nil)
}
return instantiateFromNib()
}
}
let calendarViewController = CalendarViewController.instanceFromNib()
但是,如果我尝试以下代码
let calendarViewController = CalendarViewController()
我注意到calendarViewController 是从XIB 创建的! (因为它包含了来自 XIB 的所有 UI 组件)
我还注意到,如果我从项目中删除 CalendarViewController.xib 并运行相同的代码
let calendarViewController = CalendarViewController()
同样,视图控制器不会从 XIB 创建。
我可以知道,为什么UIViewController 是从同名XIB 创建的,即使使用了空构造函数?
【问题讨论】:
-
因为
init(name:bundle)和nil名称会在某个时候调用默认的init(),并查看developer.apple.com/documentation/uikit/uiviewcontroller/… 的文档或者它甚至在init(name:bundle:)中进行了描述 -
但这并不能解释为什么init会从“CalendarViewController.xib”读取,因为字符串值“CalendarViewController.xib”没有传递给init
-
如果 UIViewController 的 init 实际上是
init{ return [super initWithNibName:nil: bundle: nil];}怎么办?