Ios 为什么显示视图和隐藏视图时会出现或显示视图时不会出现';行不通
我最近将一个应用程序从modalIos 为什么显示视图和隐藏视图时会出现或显示视图时不会出现';行不通,ios,swift,uitabbarcontroller,viewwillappear,Ios,Swift,Uitabbarcontroller,Viewwillappear,我最近将一个应用程序从modalviewControllers转换为TabBarController,在转换之前有一些代码可以正常工作,但现在我很难在TabBar应用程序中工作 我想做的是根据存储在UserDefaults中的用户设置更新选项卡中的UI,这些设置发生在设置选项卡(ViewController)中,我想根据用户设置更新不同选项卡中的UI。转换之前,代码在ViewDidLoad中,工作正常,但现在使用TabBar没有ViewDidLoad我正在使用viewwillbeen,以便在选项
viewControllers
转换为TabBarController
,在转换之前有一些代码可以正常工作,但现在我很难在TabBar应用程序中工作
我想做的是根据存储在UserDefaults
中的用户设置更新选项卡中的UI
,这些设置发生在设置
选项卡(ViewController)中,我想根据用户设置更新不同选项卡中的UI。转换之前,代码在ViewDidLoad
中,工作正常,但现在使用TabBar
没有ViewDidLoad
我正在使用viewwillbeen,以便在选项卡激活但不工作时立即更新
这是代码
class UserInputViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
// customizeApp() // everything works if called from here
}
override func viewWillAppear(_ animated: Bool) {
customizeApp() // Doesn't work
}
override func viewDidAppear(_ animated: Bool) {
// customizeApp() // Doesn't work
}
func customizeApp(){
if isView1(){
view1.isHidden = false
}else{
view1.isHidden = true
}
if isButton1(){
button1.isHidden = false
}else{
button1.isHidden = true
}
if isTextField1(){
textField1.isHidden = false
}else{
textField1.isHidden = true
}
if isTextField2(){
textField2.isHidden = false
}else{
textField2.isHidden = true
}
/// Adjust Screen based on settings
if textField1.isHidden && textField2.isHidden{
constraintMainButton.constant = 7
return
}
if textField1.isHidden {
constraintMainButton.constant = 45
}
if textField2.isHidden {
constraintMainButton.constant = 45
}
}
func isView1()->Bool{// read UserDefaults}
func isButton1()->Bool{// read UserDefaults}
func isTextField1()->Bool{// read UserDefaults}
func isTextField2()->Bool{// read UserDefaults}
}
我还尝试了viewdilayoutsubviews
,但也没有成功
你知道会出什么问题吗?
仅供参考-所有值均来自UserDefaults
编辑:
我的问题是,我正在重新定位我的视图,但我没有将它们重新定位回原始位置。我知道这听起来很傻,但在切换到uitabar
之前,当我从ViewDidLoad
调用customizeApp()
时,完全相同的代码工作正常,这一事实欺骗了我。最后,我从viewdideappease()
方法调用了customizeApp()
class UserInputViewController: UIViewController{
/// ... Code
override func viewDidAppear(_ animated: Bool) {
customizeApp()
}
func customizeApp(){
/// ... Code
/// Adjust Screen based on settings
if textField1.isHidden && textField2.isHidden{
constraintMainButton.constant = 7
return
}
if textField1.isHidden {
constraintMainButton.constant = 45
return // added
}
if textField2.isHidden {
constraintMainButton.constant = 45
return // added
}
constraintMainButton.constant = 83 // added: Original Position
}
/// .... Code
}
谢谢
正如@deadbeef所说,在视图中将出现call super和其他内容
加载和显示视图控制器视图的过程
故事板使加载和显示视图控制器视图的过程非常简单。当需要时,UIKit会自动从序列图像板文件加载视图。作为加载过程的一部分,UIKit执行以下任务序列:
viewDidLoad()
中,视图将出现(:)
,而视图将消失(:)
您必须始终调用super
在下一次更新视图布局之前,更新约束上的常量不会起任何作用
在viewdiload()
中更改布局约束时,它发生在布局最终确定之前,因此更改将应用于下一个布局过程
如果要更改约束,需要调用layoutifneed()
。尝试将此添加到customizeApp()
函数:
func customizeApp() {
defer {
self.view.layoutIfNeeded()
}
}
始终在
视图中调用super将出现
和其他视图。否则你会破坏一切。你在哪里查看1,按钮1
。。。来自哪里?好的。仅供参考,任何以viewWill/viewDid开头的内容都必须调用super。作为一般规则,在重写UIKit类时,除非文档明确要求不调用super。正如@deadbeef指出的,您应该添加:super.viewwillbeen(动画)
和super.viewdidebeen(动画)
Ok,事实证明,我的问题是我重新定位了我的视图,但我没有将它们重新定位回其原始位置。我知道这听起来很傻,但当我从ViewDidLoad
调用customizeApp()
时,完全相同的代码工作正常,这一事实欺骗了我,但多亏了你的解释,我才能够找到问题。仅供参考-我不需要调用self.view.layoutifneed()
我只是调用了customizeApp()
fromviewdide
并通过调整约束将我的视图重新定位到其原始位置。非常感谢你的帮助!