从 UITabeVieCell 中获取数据以填充到另一个 ViewController

Take data from UITabeVieCell to populate to another ViewController

我已经将我的应用程序添加到 Chameleon Framework 以生成随机颜色,我想将内部设置添加到我的应用程序。例如,我创建了一个 tabelViewController VC,然后我添加了一个开关,我想要的是当 mySwitch 开启时,我希望变色龙颜色填充 tableViewCells,当它关闭时,我希望 tableViewCells 为 .systemBackgoundColor。

我的设置VC

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "Chameleon Color"
    let mySwitch = UISwitch()
    mySwitch.onTintColor = .blue
    mySwitch.addTarget(self, action: #selector(didTabSwitch(_:)), for: .valueChanged)
    cell.accessoryView = mySwitch
    return cell
}

@objc func didTabSwitch(_ sender: UISwitch){
    if sender.isOn {
       // populate the chameleon framework color
    }
    else {
     // change to the default background color
    }
}

ViewController

/// Provides a cell object for each row.
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // Fetch a cell of the appropriate type.
   let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    
    cell.textLabel?.text = list[indexPath.row].name
    cell.backgroundColor = UIColor(hexString: list[indexPath.row].color)
    cell.textLabel?.textColor = UIColor(contrastingBlackOrWhiteColorOn: cell.backgroundColor, isFlat: true)
    
    if let date  = list[indexPath.row].date {
        let formater = DateFormatter()
        formater.timeZone = .current
        formater.locale = .current
        formater.timeStyle = .short
        formater.dateStyle = .none
        
        cell.detailTextLabel?.text = formater.string(from: date)
        cell.detailTextLabel?.textColor = UIColor(contrastingBlackOrWhiteColorOn: cell.backgroundColor, isFlat: true)
    }
   return cell
}

如有任何帮助或提示,我们将不胜感激。

这归结为“我如何在我的应用程序的不同组件之间进行通信”。因为我假设您不只是想通知您的 ViewController 颜色变化,而是更新整个 UI(比如应用主题),最简单的方法是使用 NotificationCenter并为其提供颜色,以便所有对更改感兴趣的组件都可以观察到它。

public extension NSNotification.Name {
  static let ColorChanged = Self(rawValue: "color_changed")
}

@objc func didTabSwitch(_ sender: UISwitch){
  if sender.isOn {
    NotificationCenter.default.post(name: .ColorChanged, object: UIColor.randomFlat)
  }
  else {
    NotificationCenter.default.post(name: .ColorChanged, object: nil)
  }
}

ViewController(或其他感兴趣的组件)

private var chameleonColor: UIColor? {
  didSet {
    tableView.reloadData()
  }
}

override func viewDidLoad() {
  super.viewDidLoad()
 
  NotificationCenter.default.addObserver(
    self,
    selector: #selector(updateColor),
    name: .ColorChanged,
    object: nil
  )
}

@objc private func updateColor(_ notification: Notification) {
  chameleonColor = notification.object as? UIColor
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  // ...
  cell.backgroundColor = chameleonColor ?? .systemBackgroundColor
}