ios - UITableView 和 UITextField borderColor 问题

标签 ios swift uitableview uitextfield

我是 Swift 新手,通过实践学习更多知识。无法指出我的错误。 我是否编码错误或实现错误。

我正在尝试在 Chameleon 的帮助下实现主题功能框架。 我已经能够更改一些 UI 元素的颜色,例如 UISegmentedControlUIButton,但我无法更改 borderColor UITextField 的 code> 和 UITableViewborderColor 以及separatorColor。 UITextFieldUITableView 的颜色更改是在相应组件的层上完成的。 难道是我的图层问题?

预览:

Preview

  1. 第一个屏幕:ViewController
  2. 第二个屏幕:ColorTableViewController

我的代码: //ViewController.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
    }

}

//ColorTableViewController.swift

import UIKit
import ChameleonFramework
import CDAlertView

class ColorTableViewController: UITableViewController {
    var chameleonColorNames = ["Maroon (dark)","Maroon (light)",
                               "Red (dark)","Red (light)",
                               "Watermelon (dark)","Watermelon (light)",
                               "Orange (dark)","Orange (light)",
                               "Yellow (dark)","Yellow (light)",
                               "Lime (dark)","Lime (light)",
                               "Green (dark)","Green (light)",
                               "Mint (dark)","Mint (light)",
                               "Forest Green(dark)","Forest Green(light)",
                               "Teal (dark)","Teal (light)",
                               "Navy Blue(dark)","Navy Blue(light)",
                               "Blue (dark)","Blue (light)",
                               "Sky Blue(dark)","Sky Blue(light)",
                               "Powder Blue(dark)","Powder Blue (light)",
                               "Plum (dark)","Plum (light)",
                               "Purple (dark)","Purple (light)",
                               "Magenta (dark)","Magenta (light)",
                               "Pink (dark)","Pink (light)",
                               "Brown (dark)","Brown (light)",
                               "Coffee (dark)","Coffee (light)",
                               "Sand (dark)","Sand (light)",
                               "Black",
                               "Gray (dark)","Gray (light)",
                               "White (dark)","White (light)"]
    var chameleonColors = [UIColor.flatMaroonDark,UIColor.flatMaroon,
                           UIColor.flatRedDark,UIColor.flatRed,
                           UIColor.flatWatermelonDark,UIColor.flatWatermelon,
                           UIColor.flatOrangeDark,UIColor.flatOrange,
                           UIColor.flatYellowDark,UIColor.flatYellow,
                           UIColor.flatLimeDark, UIColor.flatLime,
                           UIColor.flatGreenDark,UIColor.flatGreen,
                           UIColor.flatMintDark,UIColor.flatMint,
                           UIColor.flatForestGreenDark,UIColor.flatForestGreen,
                           UIColor.flatTealDark,UIColor.flatTeal,
                           UIColor.flatNavyBlueDark,UIColor.flatNavyBlue,
                           UIColor.flatBlueDark,UIColor.flatBlue,
                           UIColor.flatSkyBlueDark,UIColor.flatSkyBlue,
                           UIColor.flatPowderBlueDark,UIColor.flatPowderBlue,
                           UIColor.flatPlumDark,UIColor.flatPlum,
                           UIColor.flatPurpleDark,UIColor.flatPurple,
                           UIColor.flatMagentaDark,UIColor.flatMagenta,
                           UIColor.flatPinkDark,UIColor.flatPink,
                           UIColor.flatBrownDark,UIColor.flatBrown,
                           UIColor.flatCoffeeDark,UIColor.flatCoffee,
                           UIColor.flatSandDark,UIColor.flatSand,
                           UIColor.flatBlack,
                           UIColor.flatGrayDark,UIColor.flatGray,
                           UIColor.flatWhiteDark,UIColor.flatWhite]



    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return chameleonColorNames.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "colorCell", for: indexPath) as! ColorTableViewCell

        // Configure the cell...
        cell.colorNameLabel.text = chameleonColorNames[indexPath.row]
        cell.colorView.backgroundColor = chameleonColors[indexPath.row]


        return cell
    }
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 43.5
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        print("\(chameleonColorNames [indexPath.row])")

        let selectedThemeColor = chameleonColors[indexPath.row]
        let alert = CDAlertView(title: "Theme", message: " Apply \(chameleonColorNames[indexPath.row]) theme?" , type: .notification)
        alert.circleFillColor = selectedThemeColor

        alert.hideAnimations = { (center, transform, alpha) in
            transform = CGAffineTransform(scaleX: 0.3, y: 0.3)
            alpha = 0
        }

        let doneAction = CDAlertViewAction(title: "Yes", handler: { action in
            self.applyTheme(selectedColor: selectedThemeColor)
            self.navigationController?.popViewController(animated: true)
        })
        let noAction = CDAlertViewAction(title: "No")
        alert.add(action: doneAction)
        alert.add(action: noAction)
        alert.show()
    }

    func applyTheme(selectedColor: UIColor) {
        Chameleon.setGlobalThemeUsingPrimaryColor(selectedColor, with: .contrast)
        navigationController?.navigationBar.barTintColor = selectedColor
        let contrastingColor = UIColor(contrastingBlackOrWhiteColorOn:selectedColor, isFlat: true)
        navigationController?.navigationBar.titleTextAttributes = [.foregroundColor : contrastingColor]
        saveThemeColors(thmColor: selectedColor, contrastColor: contrastingColor)

    }
    func saveThemeColors(thmColor: UIColor,contrastColor: UIColor)  {
        UserDefaults.standard.set(thmColor, forKey: "themeColor") 
        UserDefaults.standard.set(contrastColor, forKey: "contrastThemeColor")
    }
}
extension UserDefaults {
    func set(_ color: UIColor, forKey key: String) {
        set(NSKeyedArchiver.archivedData(withRootObject: color), forKey: key)
    }
    func color(forKey key: String) -> UIColor? {
        guard let data = data(forKey: key) else { return nil }
        return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor
    }
}

最佳答案

didSet 在新值存储到变量后立即调用。在您的情况下,您的变量的 didSet 没有调用。尝试更新 viewWillAppear 或 viewDidAppear block 上的主题颜色和 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()
}

或者您可以使用委托(delegate)协议(protocol)来通知您的viewController,而不是使用viewDidAppear。

关于ios - UITableView 和 UITextField borderColor 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50567376/

相关文章:

ios - 当应用程序恢复时注销后快速解析应用程序崩溃

ios - 单元测试覆盖率%0

ios - AFnetworking 互联网可达性

ios - 将信息发送到另一个 View Controller

ios - 为什么 tableView reloadData 不调用 cellForRowAtIndexPath

ios - NSMutableArray 到 UITableView

ios - 背景颜色 iOS 6 用于横向模式的应用程序

ios - 没有这样的模块 'FirebaseUI' iOS

objective-c - 如何加载带有字典数组的 tableView?

ios - 每当应用程序快速出现在屏幕上时如何运行功能?