我在一个iOS应用程序上工作,该应用程序实现了带有5个图标的UITabBarController。整个项目通过Storyboard完成。当我想为用户提供4个主题的选项时,我在静态tableView中做了什么,所以遇到了一个问题。
当用户更改主题时,先前通过tabBar视图控制器实例化的对象不会更新为主题更改,因为它们在主题更新之前就已存在。我能以某种方式关闭它们,并在UITabBar委托的didSelect方法上创建相同视图控制器类的新实例吗?
我正确地解决了这个问题吗?任何帮助将不胜感激!
在此先感谢您的帮助。
MainTabController类:UITabBarController {
override func viewDidLoad()
{
super.viewDidLoad()
}
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
{
let theme = UserDefaults.standard.string(forKey: "selectedColor")
print(theme!)
for vc in self.viewControllers!
{
if (theme == "default")
{
vc.view.backgroundColor = UIColor(red: 0xF9 , green: 0xF7 , blue: 0xF7)
}else if (theme == "theme1")
{
vc.view.backgroundColor = UIColor(red: 0x1F , green: 0xFF, blue: 0xFF)
}else if (theme == "theme2")
{
vc.view.backgroundColor = UIColor(red: 0xE3 , green: 0xFD, blue: 0xFD)
}else if (theme == "theme3")
{
vc.view.backgroundColor = UIColor(red: 0x3E, green: 0xC1, blue: 0xD3)
}
}
}
}
在每个视图控制器中实现的示例:
override func viewDidLoad()
{
let theme = UserDefaults.standard.string(forKey: "selectedColor")
print(theme!)
if (theme == "default")
{
outerView.backgroundColor = UIColor(red: 0xF9 , green: 0xF7 , blue: 0xF7)
}else if (theme == "theme1")
{
outerView.backgroundColor = UIColor(red: 0x1F , green: 0xFF, blue: 0xFF)
}else if (theme == "theme2")
{
outerView.backgroundColor = UIColor(red: 0xE3 , green: 0xFD, blue: 0xFD)
}else if (theme == "theme3")
{
outerView.backgroundColor = UIColor(red: 0x3E, green: 0xC1, blue: 0xD3)
}
}
答案 0 :(得分:1)
在didSelect
内部,您可以访问VC标签并根据需要进行更改(在该标签中的任何VC中)
for vc in self.tabBarController!.viewControllers! {
vc.view.backgroundColor = UIColor.red
// if you want to set a property
if let other = vc as? OtherViewController {
// change here
}
}
//
如果要在tabBar自定义类中使用此代码
for vc in self.viewControllers! {
vc.view.backgroundColor = UIColor.red
// if you want to set a property
if let other = vc as? OtherViewController {
// change here
}
}
//
编辑后,您需要创建一个包含externalView的协议并在每个VC中都遵循此协议,或者强制转换为VC并更改其属性
答案 1 :(得分:1)
创建自定义UITabBarController
类,并在其中viewDidLoad
中添加:
for vc in self.viewControllers! {
vc.view.backgroundColor = .....
}
现在将此自定义类链接到情节提要的UITabBarController
。
更新:
您从UserDefaults获取的值不正确。
UserDefaults.standard.string(forKey: "selectedColor")
应该是:
UserDefaults.standard.object(forKey: "selectedColor")
答案 2 :(得分:0)
解决我的问题的方法非常简单,但是经过数小时的搜索!
我不得不将所有用于编辑视图的代码而不是viewDidLoad放在viewDidAppear中,因为与之相比,viewDidLoad仅在第一次运行 每次用户按下此特定选项卡时都会调用viewDidAppear。
感谢大家的快速解答!