Изменение цвета 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 можно было использовать для этого. Я бы проверил эту ссылку для получения дополнительной информации.