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

时间:2017-06-09 02:49:32

标签: ios arrays swift swift3 segue

所以我需要一些项目的帮助。我有一个简单的标签栏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]
    }
}

}

然后我在主视图中有这个我从这里拉出来的: 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
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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以获取更多信息。