根据另一个视图控制器更改 viewController BG 颜色

Posted

技术标签:

【中文标题】根据另一个视图控制器更改 viewController BG 颜色【英文标题】:Change viewController BG color based off another view controller 【发布时间】:2017-06-09 02:49:32 【问题描述】:

所以我需要一些帮助来完成一个项目。我有一个简单的标签栏 SVC,其中第一个视图是计时器,第二个视图是设置页面。在设置页面上,我设置了一个带有颜色数组的结构,然后当用户单击按钮时,数组中的随机颜色被调用并应用于背景。这部分按我的预期工作。然后我想做的是将该颜色应用于第二个视图的背景。

这里是设置代码

import UIKit
import GameKit

public var randomColor = UIColor()

class SettingsViewController: UIViewController 


@IBOutlet weak var pushMe: UIButton!
let colorProvider = BackgroundColorProvider()

@IBAction func pushMeChange(_ sender: Any) 
randomColor = colorProvider.randomColorBG()
print (randomColor.superclass as Any)
view.backgroundColor = randomColor


struct BackgroundColorProvider 
let colors = [
    UIColor(red: 90/255.0, green: 187/255.0, blue: 181/255.0, alpha: 1.0), // teal color
    UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0), // yellow color
    UIColor(red: 223/255.0, green: 86/255.0, blue: 94/255.0, alpha: 1.0), // red color
    UIColor(red: 239/255.0, green: 130/255.0, blue: 100/255.0, alpha: 1.0), // orange color
    UIColor(red: 77/255.0, green: 75/255.0, blue: 82/255.0, alpha: 1.0), // dark color
    UIColor(red: 105/255.0, green: 94/255.0, blue: 133/255.0, alpha: 1.0), // purple color
    UIColor(red: 85/255.0, green: 176/255.0, blue: 112/255.0, alpha: 1.0), // green color
]

func randomColorBG() -> UIColor 
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: colors.count)
return colors[randomNumber]
    

然后我在从这里拉出的主 viewController 中有这个: Changing background color of all views in project from one view controller?

下面的函数确实出错并没有出错,但我充其量只是个菜鸟,我不确定铃应该如何工作,我什至怀疑它是否被调用。任何帮助表示赞赏。

// bringing in background color from SettingsViewController

 func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
    if (segue.identifier == "Load View") 
        // pass data to next view
        let viewController:SettingsViewController = segue!.destination as!  SettingsViewController
        viewController.view.backgroundColor = self.view.backgroundColor
    

【问题讨论】:

创建一个单例来管理颜色和选定的颜色,或者只是将颜色推送到第二个视图控制器 什么错误?你使用标签栏控制器吗?还是只是 tabBar? 看看我下面的答案应该可以解决您的问题。如果您还需要什么,请联系我! 【参考方案1】:

Swift 有一个称为singleton 的简洁功能,可用于跨视图控制器列表管理“设置”。在计时器视图的viewDidLoad() 方法中,您可以将视图的背景颜色设置为singleton.backgroundColor。在设置视图中,当用户选择一种新颜色时,它应该设置singleton.backgroundColor = newColorThatUserChose。这样,当用户切换回 Timer View 时,颜色会自动切换。

如上面的链接所示,可以这样创建单例:

class Settings 
    static let sharedInstance = Settings()
    var backgroundColor = UIColor.White // set to white by default.

然后在 Timer View 的 viewDidLoad 方法中:

self.view.backgroundColor = Settings.sharedInstance.backgroundColor

最后在 SettingsViewController 中当用户选择一种新颜色时:

var color = [UIColor.White, UIColor.Black, UIColor.Blue, UIColor.Green........]
Settings.sharedInstance.backgroundColor = color[x] // where x is the index that was chosen.

这将允许视图根据应用设置自动更改。为确保这适用于您想要更改颜色的所有视图,

self.view.backgroundColor = Settings.sharedInstance.backgroundColor

应该放在每个UIViewController中。

为了进一步抽象这一点,您可以创建一个名为GeneralUIViewController 的自定义类,它是UIViewController 类型的类,并在其viewDidLoad 方法中包含上述代码。完成此操作后,每个 UIViewController 都应将其类设置为 GeneralUIViewController。这样您只需在一个文件中设置背景颜色,项目中的每个视图控制器都会自动继承将其背景颜色设置为用户在此应用程序的设置页面中选择的颜色。

这些首选项可能应该在应用程序重新打开时保存,以便可以使用 CoreData。我会查看this link 了解更多信息。

【讨论】:

优秀!我认为这会奏效。但是,在我的计时器视图中,我有:override func viewDidLoad() super.viewDidLoad() self.view.backgroundColor = Settings.sharedInstance.backgroundColor print(Settings.sharedInstance.backgroundColor) 我遇到了一个问题。在设置中设置背景颜色后,当我返回主计时器视图时,背景不会改变。作为测试,我将 self.view... 插入到我的开始按钮和宾果游戏中,点击开始后 BG 发生了变化。为什么它在 ViewDidLoad 中没有改变?我有什么意义吗:)

以上是关于根据另一个视图控制器更改 viewController BG 颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个视图控制器更改标签的文本并使用核心数据保存

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?

更改父视图控制器的界面方向

从另一个类访问 viewController 元素

快速从另一个视图控制器更改 webview 的 url

如何更改 ViewController 视图后面的颜色/放置东西(swift)?