gpt4 book ai didi

ios - 如何将子类 View Controller 的 View 放入父类(super class)基 View Controller 的内容 View 中?

转载 作者:行者123 更新时间:2023-11-29 05:31:46 28 4
gpt4 key购买 nike

我创建了一个名为 baseviewcontroller 的父类(super class) uiviewcontroller 类,用于包含大多数应用屏幕所需的基本 UI。它包括一个自定义导航栏和一个“自定义选项卡栏”,我在xib中使用UIViewprotocols在底部创建看法。因此,将来,我希望仅对此 baseviewcontroller 进行子类化,以包含其所有基本 UI 元素。我可以对这个 baseviewcontroller 进行子类化,没有问题,但是底部的新 uiviewcontroller ui 元素将被我创建的“tab-bar”覆盖。

我尝试在baseviewcontroller中添加一个名为内容 View 的新UIView,设置其与“选项卡栏”相关的约束,并在后续 View Controller 中尝试将他们的 View 添加到 contentview 中。但它给了我错误(CALayer需要它自己的图层树),基本上是说我不应该做contentview.addsubview(self.view)。因此,我尝试使用约束将新的 viewcontroller's View 与内容 View 匹配,但约束失败,并且不再显示选项卡栏。关于如何做到这一点的任何想法,可能从 baseviewcontroller 优雅地做到这一点?

class BaseViewController: UIViewController, SlideMenuDelegate, SwitchTabBarDelegate{

//some other ui,custom nav and controls stuff

private var switchTabBar : SwitchTabBar!
var contentView : UIView!

override func viewDidLoad(){
super.viewDidLoad()
self.configureNavBar()
self.configureScreenEdgeRecognizer()
self.configureBaseView()
}

private func configureBaseView(){
//set up contentView for future View to add into
self.contentView = UIView(frame: CGRect.zero)
self.view.addSubview(contentView)
self.contentView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
self.contentView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
self.contentView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor).isActive = true

//set up switchtabbar for switching between viewcontrollers that inherit from base viewcontroller
self.switchTabBar = SwitchTabBar(frame: CGRect.zero)
self.switchTabBar.delegate = self
self.view.addSubview(switchTabBar)
self.switchTabBar.translatesAutoresizingMaskIntoConstraints = false
self.view.addConstraint(NSLayoutConstraint(item: self.contentView!, attribute: .bottom, relatedBy: .equal, toItem: self.switchTabBar!, attribute: .top, multiplier: 1, constant: 0))
self.switchTabBar.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
self.switchTabBar.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
self.switchTabBar.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor).isActive = true
self.switchTabBar.heightAnchor.constraint(equalToConstant: self.view.bounds.size.height/10).isActive = true
}

// some other ui functions and controls + delegate method
}

class MainPageViewController: BaseViewController{

override func viewDidLoad(){
super.viewDidLoad()
contentView.addsubview(self.view) //gives error
//or
self.view.frame = contentView.frame //doesn't work
//or
self.view.frame = contentView.bounds //doesn't work
self.view.topAnchor.constraint(contentView.topAnchor).isActive = true
/* lead,trail,bottom constraint etc but constraint breaks onruntime and won't show tab-bar anymore */
}

//edit: tried new method
override func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
// this create half black screen so still doesn't work
self.view.frame = self.contentView.bounds //think because contentView is constraint to the actual view it doesn't work.
}

}

请注意,BaseViewController 没有 .xib 或存在于 storyboard 中,并且完全由代码实现,但后续的 viewcontroller 可以并且将会出现在带有 socket 等的 storyboard 上,这样我的设计师就可以改变它的外观。

编辑后:从这个实验来看,从我尝试放入时出现的半黑屏来看, BaseViewController 的 View 和继承类的 View 似乎是相同的viewDidLayoutSubviews。现在猜想,我将通过在 Storyboard中添加一个具有清晰颜色的空 View 并围绕它进行构建,围绕底部选项卡栏构 build 计。

最佳答案

好的,我明白了。在尝试了不同的方法之后,我发现一种方法可以达到目的,但不是很优雅。

我已经从我的BaseViewController中删除了我的contentView,在我的继承类MainPageViewController Storyboard中,我添加了一个 View ,称之为contentView 并使其自动布局到安全区域,但我捕获了 BottomConstraint 并在 viewController 中有一个它的导出。然后我在运行时将其删除,然后添加 contentView 底部到 switchTabBar 顶部的连接约束,瞧。

class MainViewController: BaseViewController {

@IBOutlet weak var newContentView: UIView!
@IBOutlet weak var newContentBottomConstraint: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
self.setUpView()
}

private func setUpView(){
self.newContentBottomConstraint.isActive = false
self.view.addConstraint(NSLayoutConstraint(item: self.newContentView!, attribute: .bottom, relatedBy: .equal, toItem: self.switchTabBar!, attribute: .top, multiplier: 1, constant: 0))
}

}

所以现在我只需要首先在未来的 viewController 类上添加“contentView”,并在“contentView”中完成所有设计,有点像你如何做 scrollView与内容 View 。这个答案不是很优雅,但我想它可以完成工作。如果其他人有更好的解决方案,请发布,以便在不太麻烦的情况下我可以进行相应更改

关于ios - 如何将子类 View Controller 的 View 放入父类(super class)基 View Controller 的内容 View 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57471667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com