以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图

Posted

技术标签:

【中文标题】以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图【英文标题】:View controller not displaying subviews correctly when programmatically set as root view controller 【发布时间】:2017-12-05 02:12:07 【问题描述】:

我一直在通过在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


我希望我以编程方式布局的视图控制器在设置为根视图控制器时能够正确显示,但视图不可见或布局不正确。只有当视图控制器由另一个视图控制器呈现时,它们才会正确显示。

【问题讨论】:

【参考方案1】:

看起来这种行为是由未设置引起的self.translatesAutoresizingMaskIntoConstraints = false 在我的自定义视图中setupView()

【讨论】:

以上是关于以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?

设置根视图控制器,然后以编程方式导航到下一个视图

如何以编程方式设置根视图控制器?

当以编程方式设置根视图控制器时,导航和标签栏丢失

在 Swift 中以编程方式设置根视图控制器

无法以编程方式执行 unwind segue