我是Swift的新手,通过做更多的学习。无法查明我的错误。 我编码错误或执行错误。
我试图在Chameleon框架的帮助下实现主题功能。
我已经能够更改一些UI元素的颜色,例如UISegmentedControl
和UIButton
,但我无法更改borderColor
的{{1}} {1}}和UITextField
以及borderColor
的separatorColor。 UITableView
和UITextField
的颜色更改在各个组件的图层上完成。
这层可能是我的问题吗?
预览:
UITableView
ViewController
我的代码: // ViewController.swift
ColorTableViewController
// ColorTableViewController.swift
import UIKit
import ChameleonFramework
import QuartzCore
class ViewController: UIViewController {
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var button: UIButton!
var themeColor = UIColor.black {
didSet{
if (UserDefaults.standard.value(forKey: "themeColor") != nil) {
themeColor = UserDefaults.standard.value(forKey: "themeColor") as! UIColor
}
else{
themeColor = UIColor.black
}
}
}
var themeContrastColor = UIColor.white {
didSet{
if (UserDefaults.standard.value(forKey: "contrastThemeColor") != nil) {
themeContrastColor = UserDefaults.standard.value(forKey: "contrastThemeColor") as! UIColor
}
else{
themeContrastColor = UIColor.white
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
styleUI()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func styleUI(){
DispatchQueue.main.async {
self.segmentedControl.tintColor = self.themeColor
self.tableView.tintColor = self.themeColor
self.tableView.layer.borderWidth = 1.0
self.tableView.layer.borderColor = self.themeColor.cgColor
self.tableView.separatorColor = self.themeColor
self.textField.layer.borderWidth = 1.0
self.textField.layer.masksToBounds = true
self.textField.layer.borderColor = self.themeColor.cgColor
self.textField.tintColor = self.themeColor
self.button.backgroundColor = self.themeColor
self.button.tintColor = self.themeContrastColor
}
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource{
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 7
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath)
cell.textLabel?.text = "Row: \(indexPath.row)"
return cell
}
}
答案 0 :(得分:0)
didSet。在你的情况下你的变量didSet没有调用。尝试在viewWillAppear或viewDidAppear块上更新主题颜色和themeContrastColor。
之后,您应该在viewWillAppear或viewDidAppear中再次调用styleUI()方法。
var themeColor = UIColor.black
var themeContrastColor = UIColor.white
override func viewDidAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let themeColorData = UserDefaults.standard.value(forKey: "themeColor")
let contrastColorData = UserDefaults.standard.value(forKey: "contrastThemeColor")
themeColor = (NSKeyedUnarchiver.unarchiveObject(with: themeColorData as! Data) as? UIColor)!
themeContrastColor = (NSKeyedUnarchiver.unarchiveObject(with: contrastColorData as! Data) as? UIColor)!
styleUI()
}
或者您可以使用委托协议来通知您的viewController,而不是使用viewDidAppear。
答案 1 :(得分:0)
不要使用var themeColor = UIColor.black
,请尝试使用:
var themeColor: UIColor? {
didSet {
}
}