以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图
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()
。
【讨论】:
以上是关于以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图的主要内容,如果未能解决你的问题,请参考以下文章