Изменение цвета viewController BG на основе другого контроллера представления

Поэтому мне нужна помощь для проекта. У меня есть простая панель вкладок SVC, где первый вид - это таймер, а второй - страница настроек. На странице настроек я настроил структуру с массивом цветов, затем, когда пользователь нажимает кнопку, вызывается случайный цвет в массиве и применяется к фону. Эта часть работает так, как я намеревался. То, что я хотел бы сделать, это применить этот цвет к фону второго вида.

Вот код настроек

import UIKit
import GameKit

public var randomColor = UIColor()

class SettingsViewController: UIViewController {


@IBOutlet weak var pushMe: UIButton!
let colorProvider = BackgroundColorProvider()

@IBAction func pushMeChange(_ sender: Any) {
randomColor = colorProvider.randomColorBG()
print (randomColor.superclass as Any)
view.backgroundColor = randomColor
}

struct BackgroundColorProvider {
let colors = [
    UIColor(red: 90/255.0, green: 187/255.0, blue: 181/255.0, alpha: 1.0), // teal color
    UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0), // yellow color
    UIColor(red: 223/255.0, green: 86/255.0, blue: 94/255.0, alpha: 1.0), // red color
    UIColor(red: 239/255.0, green: 130/255.0, blue: 100/255.0, alpha: 1.0), // orange color
    UIColor(red: 77/255.0, green: 75/255.0, blue: 82/255.0, alpha: 1.0), // dark color
    UIColor(red: 105/255.0, green: 94/255.0, blue: 133/255.0, alpha: 1.0), // purple color
    UIColor(red: 85/255.0, green: 176/255.0, blue: 112/255.0, alpha: 1.0), // green color
]

func randomColorBG() -> UIColor {
let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: colors.count)
return colors[randomNumber]
    }
}

}

Тогда у меня есть это в главном viewController, который я вытащил отсюда: Изменение цвета фона всех представлений в проекте из одного контроллера представления?

Функция делает ошибку ниже, не ошибка, однако я в лучшем случае нуб, я не уверен, как должен работать звонок, и я сомневаюсь, что он даже вызывается. Любая помощь приветствуется.

// bringing in background color from SettingsViewController

 func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "Load View") {
        // pass data to next view
        let viewController:SettingsViewController = segue!.destination as!  SettingsViewController
        viewController.view.backgroundColor = self.view.backgroundColor
    }
}

1 ответ

Решение

У Swift есть эта замечательная функция, называемая одноэлементной, которая может использоваться для управления "настройками" в списке контроллеров представления. в viewDidLoad() Метод представления таймера вы можете установить цвет фона представления singleton.backgroundColor, В представлении настроек, когда пользователь выбирает новый цвет, он должен установить singleton.backgroundColor = newColorThatUserChose, Таким образом, когда пользователь снова переключается на представление таймера, цвет автоматически переключается.

Как показано в ссылке выше, синглтон может быть создан следующим образом:

class Settings {
    static let sharedInstance = Settings()
    var backgroundColor = UIColor.White // set to white by default.
}

Затем в методе viewDidLoad для Timer View:

self.view.backgroundColor = Settings.sharedInstance.backgroundColor

Наконец в SettingsViewController, когда пользователь выбирает новый цвет:

var color = [UIColor.White, UIColor.Black, UIColor.Blue, UIColor.Green........]
Settings.sharedInstance.backgroundColor = color[x] // where x is the index that was chosen.

Это позволит представлениям изменяться автоматически в зависимости от настроек приложений. Чтобы убедиться, что это работает во всех видах, для которых вы хотите изменить цвет,

self.view.backgroundColor = Settings.sharedInstance.backgroundColor

должны быть размещены в каждом UIViewController,

Чтобы дополнительно абстрагировать это, вы можете создать собственный класс с именем GeneralUIViewController который является классом типа UIViewController и имеет вышеуказанный код в своем viewDidLoad метод. После этого у каждого UIViewController должен быть установлен класс GeneralUIViewController, Это сделает так, что вам нужно будет установить цвет фона только в одном файле, и каждый контроллер представления в вашем проекте автоматически унаследует установку его цвета фона на тот, который Пользователь выбрал на странице настроек этого приложения.

Эти предпочтения, вероятно, следует сохранить при повторном открытии приложения, чтобы CoreData можно было использовать для этого. Я бы проверил эту ссылку для получения дополнительной информации.

Другие вопросы по тегам