Ошибка возникает, когда я захожу в свой контроллер просмотра настроек.В настройках есть UISegmentedControl, который подключен к theme.swift через SettingsViewcontroller.swift ViewDidLoad ().
Я следовал учебному пособию, но получил ошибку по поводу перечисления Theme, которая исчезла, когда я добавил значение Intвведите объявление enum.Тема возвращается структурой ThemeManager с rawValue.
Я почти уверен, что ошибка вызвана settingsViewController.swift.Поскольку единственный код, который выполняется при загрузке settingsViewController.swift, находится в методе viewDidLoad (), я думаю, что проблема в этом.
Причиной необработанного исключения является «представление UITableViewSection», котороеЯ предполагаю, что это UISegmentControl, так как единственный другой раздел - это кнопка «Применить», код которой не запускается, пока она не нажата?!
Я читал о похожих ошибках и понял, что методвызывается для объекта, который не содержит указанный метод.Я не вижу ничего подобного, но я не уверен в строке 30 в Theme.swift.Мне пришлось изменить учебный код из-за множественных ошибок.Либо это, либо перечисление Theme не должно быть Int (строка 13 Theme.swift).
Theme.swift
import UIKit
let SelectedThemeKey = "SelectedTheme"
enum Theme : Int {
case Default, Dark, Graphical
var mainColor: UIColor {
switch self {
case .Default:
return UIColor(red: 87.0/255.0, green: 188.0/255.0, blue: 95.0/255.0, alpha: 1.0)
case .Dark:
return UIColor(red: 242.0/255.0, green: 101.0/255.0, blue: 34.0/255.0, alpha: 1.0)
case .Graphical:
return UIColor(red: 10.0/255.0, green: 10.0/255.0, blue: 10.0/255.0, alpha: 1.0)
}
}
}
struct ThemeManager {
static func currentTheme() -> Theme {
if let storedTheme = (UserDefaults.standard.value(forKey: SelectedThemeKey) as AnyObject).integerValue {
return Theme(rawValue: storedTheme)!
} else {
return .Default
}
}
static func applyTheme(theme: Theme) {
// 1
UserDefaults.standard.setValue(theme.rawValue, forKey: SelectedThemeKey)
UserDefaults.standard.synchronize()
// 2
let sharedApplication = UIApplication.shared
sharedApplication.delegate?.window??.tintColor = theme.mainColor
}
}
SettingsViewcontroller.swift
import UIKit
class SettingsViewController: UITableViewController {
@IBOutlet weak var themeSelector: UISegmentedControl!
@IBOutlet weak var applyButton: UIButton!
//@IBOutlet weak var settingsTableView: UITableView!
//let settingsTableOptions = ["Turn On Dark Mode"]
override func viewDidLoad() {
super.viewDidLoad()
// Register custom cell
//let nib = UINib(nibName: "settingsTableCell", bundle: nil)
//settingsTableView.register(nib, forCellReuseIdentifier: "Settings")
themeSelector.selectedSegmentIndex = ThemeManager.currentTheme().rawValue
}
func dismiss() {
self.dismiss(animated: true, completion: nil)
}
@IBAction func applyTheme(sender: UIButton) {
if let selectedTheme = Theme(rawValue: themeSelector.selectedSegmentIndex) {
ThemeManager.applyTheme(theme: selectedTheme)
}
dismiss()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated);
}
}
I've setup the story board for the settings view exactly as the tutorial, and don't recognise any options that could cause my problem.