page de parameters pour append ou soustraire des arrays d'images différents. Codage avec swift et xcode

J'essaie de faire une application flashcard simple.

APERÇU – Pour vous donner la base de l'application, toutes les maps contiennent un object qui a la lettre l. Parfois, le mot commence par la lettre l, parfois il y a un double ll, parfois le mot commence par pl ou kl, ou sl, etc …

SO FAR – J'ai fait l'application afin qu'il y ait une page d'accueil et à partir de la page d'accueil, vous appuyez sur Go, puis il vous faut aussi un controller de deuxième vue. De là, vous pouvez glisser à gauche et à droite à travers les maps flash. Je l'ai fait en créant un tableau avec toutes les images, puis en ajoutant un geste de balayage (code ci-dessous)

// // SecondViewController.swift // firstapp // // Created by Anthony Rubin on 6/20/17. // Copyright © 2017 rubin. All rights reserved. // import UIKit class SecondViewController: UIViewController , UIGestureRecognizerDelegate { @IBAction func home(_ sender: Any) { performSegue(withIdentifier: "home", sender: self) } @IBOutlet weak var imgPhoto: UIImageView! var imageList:[Ssortingng] = ["alligator", "apple", "balance", "ball", "ballerina", "balloon", "bell", "belt", "black", "blanket", "blender", "blocks", "blond", "blood", "blow", "blue", "bowling", "bubble", "bully", "calendar", "castle", "cello", "clam", "clamp", "clap", "claw", "clean", "climb", "clip", "cloud", "cold", "colors", "crawl", "curlyhair", "dollar", "dolphin", "elephant", "elf", "eyelashes", "fall", "fishbowl", "flag", "flipflop", "float", "floor", "flower", "fluffy", "flute", "fly", "gasoline", "girl", "glacier", "glad", "glasses", "glide", "glitter", "globe", "glove", "glue", "goalie", "golf", "hula", "jellyfish", "ladder", "ladybug", "lake", "lamb", "lamp", "lark", "laughing", "lawnmower", "leaf", "leash", "left", "leg", "lemon", "leopard", "leprechaun", "letters", "licking", "lifesaver", "lifting", "lightbulb", "lightning", "lime", "lion", "lips", "list", "listn", "llama", "lock", "log", "look", "love", "lunch", "melt", "milk", "olive", "owl", "pail", "peel", "pillow", "pilot", "planet", "plank", "plant", "plate", "play", "plum", "plumber", "plus", "polarbear", "pool", "rollerskate", "ruler", "shelf", "silly", "sled", "sleep", "sleeves", "slice", "slide", "slime", "slip", "slow", "smile", "telephone", "television", "tulip", "umbrella", "valentine", "violin", "whale", "wheel", "xylophone", "yellow"] let maxImages = 135 var imageIndex: NSInteger = 0 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. imgPhoto.isUserInteractionEnabled = true let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) leftSwipe.cancelsTouchesInView = false let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) rightSwipe.cancelsTouchesInView = false leftSwipe.direction = .left rightSwipe.direction = .right view.addGestureRecognizer(leftSwipe) view.addGestureRecognizer(rightSwipe) } func Swiped(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right : print("User swiped right") // decrease index first imageIndex -= 1 // check if index is in range if imageIndex < 0 { imageIndex = maxImages } imgPhoto.image = UIImage(named: imageList[imageIndex]) case UISwipeGestureRecognizerDirection.left: print("User swiped Left") // increase index first imageIndex += 1 // check if index is in range if imageIndex > maxImages { imageIndex = 0 } imgPhoto.image = UIImage(named: imageList[imageIndex]) default: break //stops the code/codes nothing. } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ 

LE PROBLÈME – Je veux créer une page de parameters. Cette page de parameters aura un interrupteur de base pour chaque groupe de mots. Alors disons que je ne veux pas de mots qui ont la lettre initiale l, je tournerais le button aussi la position d'arrêt et puis quand je balayerai les images il n'y aura pas de flashcards avec la lettre initiale l.

page des parameters

MON IDÉE – J'imagine que je vais devoir connecter chaque interrupteur on / off aussi son tableau correspondant de mots et ensuite le code si, puis les déclarations pour chaque button. Ensuite, ajoutez tous les arrays set. Cependant, je ne suis pas sûr du tout comment commencer à le faire. J'ai fait une vue de table avec tous les différents commutateurs on et off mais n'ai pas encore ajouté n'importe quelle fonctionnalité. Je ne suis pas sûr non plus comment je vais envoyer l'information de ma vue de table au controller de deuxième vue.

Je sais que c'est beaucoup à poser dans une question mais toute aide serait très appréciée. Je vous remercie

Il y a beaucoup de choses ici, mais vous semblez avoir pris un bon départ.

Si les mots et les catégories sont assez fixes alors la première chose que je ferais est de split la list de mots en différentes catégories, alors vous pouvez combiner ceux que vous voulez pour vos images en utilisant:

 let list1 = ["Bat", "Cow"] let list2 = ["Frog", "Rabbit"] let list3 = ["Parrot", "Tiger"] var imageList: [Ssortingng] { return list1+list2 } 

Vous pouvez conserver un tableau de lists actives, puis utiliser une fonction de reduce pour returnner le tableau final:

 var activeLists = [list1, list2] var imageList: [Ssortingng] { return activeLists.reduce([], {$0 + $1}) } 

Mais vous aurez probablement besoin d'une source de données plus maniable qu'un simple tableau de strings pour stocker l'information peut-être:

 struct List { let words: [Ssortingng] var active: Bool } 

Ensuite, vous pourriez avoir:

 let list1 = List(words: ["Bat", "Cow"], active: true) let list2 = List(words: ["Frog", "Rabbit"], active: true) let list3 = List(words: ["Parrot", "Tiger"], active: true) var wordLists = [list1, list2, list3] var imageList: [Ssortingng] { let active = wordLists.reduce([]) { (result:[Ssortingng], list:List) in if list.active { return result + list.words } else { return result } } return active } 

Note: Je n'utiliserais pas maxImages comme une constante car cela devra changer, vous pouvez utiliser imageList.count place.

En ce qui concerne l'envoi d'informations, il existe plusieurs façons de le faire. Une façon est d'utiliser prepareForSegue pour envoyer les informations au nouveau viewController. Quelque chose comme ça:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? SettingsViewController { vc.wordLists = wordLists } } 

Ensuite, dans les parameters, vous pouvez basculer entre les lists de mots individuelles avec:

 wordLists[1].active = false 

Un moyen facile de faire correspondre les commutateurs à la reference du tableau est de donner à chaque UISwitch un Tag dans le Storyboard qui correspond à son index dans le tableau wordLists, de connecter tous les UISwitches à la même IBAction puis, quand il est déclenché, utilisez:

 @IBAction func switchAction(_ sender: UISwitch) { wordList[sender.tag].active = rollIntoLoanSwitch.isOn } 

Vous pouvez ensuite utiliser un délégué pour renvoyer l'information sur chaque bascule ou lorsque vous quittez la vue. Vous pouvez également définir vos lists de mots dans une class séparée, avec un singleton et la referencer de partout, cela dépend du nombre de vues différentes dont vous aurez besoin pour accéder aux lists de mots.

Vous pouvez utiliser le model de délégation pour envoyer un message d'un controller de vue à un autre. Pour le model de délégation, vous faites de SecondViewController un délégué de SettingsViewController et configurez la communication entre les deux classs.

Si vous devez transmettre des données de SettingsViewController à SecondViewController

Créez un protocole dans SettingsViewController en tant que

 protocol SettingsViewControllerDelegate { func settingDidFinished(data : [Ssortingng]) } 

Créez un ID dans SettingsViewController, de sorte que vous pouvez affecter n'importe quelle class en tant que sa class de délégué.

 class SettingsViewController : UIViewController { // MARK:- Delegate var SettingsViewControllerDelegate ? 

Méthode de protocole d'appel dans SettingsViewController sur le button Soumettre ou lorsque nécessaire.

  @IBAction private func doneTapped(_ sender: AnyObject) { delegate?.settingDidFinished(data : yourSettingsArray) } 

Créez un object de SettingsViewController dans SecondViewController et affectez SecondViewController en tant que délégué de SettingsViewController en tant que

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let settingsVc = segue.destinationViewController as? SettingsViewController { settingsVc .delegate = self } } 

Implémenter les methods de protocole requirejses de SettingsViewController dans SecondViewController

  extension SecondViewController: SettingsViewControllerDelegate { // # 4: "SecondViewController" implements "SettingsViewControllerDelegate " protocols: func settingDidFinished(data : [Ssortingng]) { print("Settings finished") // use settings Array here. Access your settings here and add/substract array as per your requirements. } } 

J'espère que cela aide .. Codage heureux .. 🙂