темный режим на нескольких представлениях и проблемы, возникшие при реализации темного режима iOS - PullRequest
0 голосов
/ 06 августа 2020

Я хотел бы реализовать тестирование iOS темного режима с 3 вариантами: светлый, темный и системный. Первые два заставят приложение в этом конкретном состоянии и не будут следовать системным настройкам.

Прямо сейчас я хотел бы реализовать эти настройки в нескольких представлениях вместо одного представления, и я создал параметры во втором представлении . Но прямо сейчас у меня возникли две проблемы:

  1. «светлый» и «темный» влияют только на второй вид, а не на все виды.
  2. Я использую презентацию модально для перехода к раскадровке. . Когда я меняю свои параметры с «системы» на «темный» во втором обзоре, он переходит в темный режим. Но если я закрою второе представление и снова открою его, щелкнув самоопределяемую кнопку, он вернется в состояние «система».

Ниже мой код для второго просмотра

import UIKit

class DarkModeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var darkModeTable: UITableView!

    var statusBarStyle = UIStatusBarStyle.default { didSet { setNeedsStatusBarAppearanceUpdate() } }
    override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle }
    
    let mode = ["Light", "Dark", "System"]
    var currentStatus = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        
        switch currentStatus {
        case "Light":
            overrideUserInterfaceStyle = .light
            statusBarStyle = .darkContent
            break
        case "Dark":
            overrideUserInterfaceStyle = .dark
            statusBarStyle = .lightContent
            break
        case "System":
            overrideUserInterfaceStyle = .unspecified
            statusBarStyle = .default
            break
        default:
            break
        }
        
        darkModeTable.dataSource = self
        darkModeTable.delegate = self
    }
    
    // Table View Data Source method
     func numberOfSections(in tableView: UITableView) -> Int {
        return 1
     }
    
     // Table View Data Source method
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return mode.count
     }

     // Table View Data Source method
     func tableView(_ tableView: UITableView,
     cellForRowAt indexPath: IndexPath)
     -> UITableViewCell {

        var cell: UITableViewCell!

         //take a cell from the queue of reusable cells
         cell = tableView.dequeueReusableCell(
         withIdentifier: "tableCell")

         //if there are no reusable cells
         if cell == nil {

             // create a new cell
             cell = UITableViewCell(
             style: UITableViewCell.CellStyle.default,
             reuseIdentifier: "tableCell")
         }

         // set the textLabel for the cell
         cell!.textLabel!.text = mode[indexPath.row]
        
        if (overrideUserInterfaceStyle == .light){
            if (mode[indexPath.row] == "Light"){
                cell.accessoryType = .checkmark
                currentStatus = "Light"
            }
            else{
                cell.accessoryType = .none
            }
        }
        else if (overrideUserInterfaceStyle == .dark){
            if (mode[indexPath.row] == "Dark"){
                cell.accessoryType = .checkmark
                currentStatus = "Dark"
            }
            else{
                cell.accessoryType = .none
            }
        }
        else if (overrideUserInterfaceStyle == .unspecified){
            if (mode[indexPath.row] == "System"){
                cell.accessoryType = .checkmark
                currentStatus = "System"
            }
            else{
                cell.accessoryType = .none
            }
        }

         // return the Table View Cell
         return cell!
     }

    // Table View Delegate method
    func tableView(_ tableView: UITableView,
    didSelectRowAt indexPath: IndexPath) {
        
        //clear previous stored chacked indexPath
        for row in 0..<tableView.numberOfRows(inSection: indexPath.section) {
            if let cell = tableView.cellForRow(at: IndexPath(row: row, section: indexPath.section)) {
                cell.accessoryType = row == indexPath.row ? .checkmark : .none
            }
        }
        
        if(indexPath.row == 0)
        {
            overrideUserInterfaceStyle = .light
            statusBarStyle = .darkContent
        }
        else if(indexPath.row == 1)
        {
            overrideUserInterfaceStyle = .dark
            statusBarStyle = .lightContent
        }
        else if(indexPath.row == 2)
        {
            overrideUserInterfaceStyle = .unspecified
            statusBarStyle = .default
        }
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    }

}
...