我通过在loadView()
方法中设置自定义视图,以编程方式构建视图控制器。在将AppDelegate
中的根视图控制器更改为指定的视图控制器时,我注意到视图控制器不显示正确布局的子视图,如果它甚至被显示。使用视图调试器,我看到视图被视为在视图层次结构中,但它们无处可寻,所以我最终得到了空白视图控制器。奇怪的是,当我从另一个视图控制器呈现视图控制器时,只有它才能正确布局并且所有视图都可见。我的视图控制器都遵循下面显示的相同创建。
class ViewController: UIViewController {
private var rootView: View? {
get { return self.viewIfLoaded as? View ?? .none }
set (view) { self.view = view }
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init() {
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func loadView() {
self.rootView = View()
}
}
以下是我为视图控制器创建自定义视图的方法
class View: UIView {
// Lazy declare views here
fileprivate var shouldSetupConstraints = true
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
override func updateConstraints() {
if(shouldSetupConstraints) {
// Adding constraints here
shouldSetupConstraints = false
}
super.updateConstraints()
}
func setupView() {
// Adding subviews here
}
}
以下是我在AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
window?.backgroundColor = Palette.backgroundColor
window?.rootViewController = MyViewController()
window?.makeKeyAndVisible()
return true
}
我希望以编程方式布局视图控制器,同时将其设置为根视图控制器,但视图不可见或不正确布局。它们仅在视图控制器由另一个视图控制器呈现时才能正确显示。
答案 0 :(得分:0)
看起来这种行为是由于没有设置
而造成的
self.translatesAutoresizingMaskIntoConstraints = false
在我的自定义视图中的setupView()
中。