2017-06-09 1 views
1

J'ai donc besoin d'aide pour un projet. J'ai une simple barre d'onglets SVC où la première vue est une minuterie et la seconde est une page de paramètres. Sur la page des paramètres, j'ai configuré une structure avec un tableau de couleurs, puis lorsqu'un utilisateur clique sur un bouton, une couleur aléatoire dans le tableau est appelée et appliquée à l'arrière-plan. Cette partie fonctionne exactement comme je l'ai prévu. Ce que je voudrais faire est ensuite appliquer cette couleur à l'arrière-plan de la deuxième vue.Changer la vueController Couleur BG basée sur un autre contrôleur de vue

Voici le code des paramètres

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] 
    } 
} 

}

Ensuite, je dois cela dans la principale viewController je tire d'ici: Changing background color of all views in project from one view controller?

La fonction ne l'erreur ci-après n'erreur pas Cependant, je suis un noob au mieux, je ne sais pas comment la cloche devrait fonctionner et je doute qu'elle soit appelée. Toute aide est appréciée.

// 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 
    } 
} 
+0

Créer un singleton pour gérer la couleur et la couleur sélectionnée, ou simplement pousser la couleur vers le 2ème viewcontroller – Tj3n

+0

quelle erreur? Vous utilisez un contrôleur de tabulation? ou juste TabBar? –

+0

jeter un oeil à ma réponse ci-dessous, il devrait prendre soin de votre problème. Lmk si vous avez besoin d'autre chose! –

Répondre

0

Swift a cette caractéristique propre appelée singleton qui peut être utilisé pour gérer « paramètres » dans la liste des contrôleurs de vue. Dans la méthode viewDidLoad() de la vue du minuteur, vous pouvez définir la couleur de fond de la vue sur singleton.backgroundColor. Dans la vue des paramètres, lorsque l'utilisateur sélectionne une nouvelle couleur, il doit définir singleton.backgroundColor = newColorThatUserChose. De cette façon, lorsque l'utilisateur repasse en mode Timer View, la couleur change automatiquement.

Comme le montre le lien ci-dessus, un singleton peut être créé comme ceci:

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

Ensuite, dans la méthode viewDidLoad pour la vue Timer:

self.view.backgroundColor = Settings.sharedInstance.backgroundColor 

Enfin, dans le SettingsViewController lorsque l'utilisateur choisit une nouvelle couleur:

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

Ceci permettra aux vues de changer automatiquement en fonction des paramètres des applications. Pour vous assurer que cela fonctionne dans toutes les vues que vous souhaitez changer la couleur,

self.view.backgroundColor = Settings.sharedInstance.backgroundColor 

doit être placé dans tous les UIViewController.

Pour plus abstraite, vous pouvez créer une classe personnalisée appelée GeneralUIViewController qui est une classe de type UIViewController et a le code ci-dessus dans sa méthode viewDidLoad. Après cela, chaque UIViewController doit avoir sa classe définie sur GeneralUIViewController. Ainsi, vous n'aurez qu'à définir la couleur d'arrière-plan dans un fichier et chaque contrôleur de vue de votre projet héritera automatiquement de sa couleur d'arrière-plan en fonction de ce que l'utilisateur a choisi dans la page des paramètres de cette application.

Ces préférences devraient probablement être enregistrées lors de la réouverture de l'application afin que CoreData puisse être utilisé pour cela. Je voudrais vérifier this link pour plus d'informations.

+0

remarquable! Je pense que cela fera l'affaire. Cependant, à mon avis timer je: 'override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = Settings.sharedInstance.backgroundColor \t \t impression (Settings.sharedInstance.backgroundColor) }' J'ai couru dans un problème. Après avoir défini la couleur BG dans les paramètres, lorsque je retourne à la vue du minuteur principal, le BG ne change pas. Comme un test j'ai inséré le self.view ... dans mon bouton de démarrage et de bingo, après avoir commencé le BG est changé. Pourquoi cela ne change-t-il pas dans le ViewDidLoad? Suis-je sensé :) – aboodness