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

时间:2017-12-05 02:12:08

标签: ios swift uiviewcontroller uiwindow programmatically

我通过在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 个答案:

答案 0 :(得分:0)

看起来这种行为是由于没有设置
而造成的 self.translatesAutoresizingMaskIntoConstraints = false
在我的自定义视图中的setupView()中。