2017-07-27 8 views
1

APERÇU - Je crée une application de carte mémoire. Je suis arrivé au point où l'utilisateur peut glisser à gauche et à droite à travers un tableau d'images. Les images sont divisées en 11 groupes différents et tous les groupes s'ajoutent à un tableau final que l'utilisateur peut balayer (code ci-dessous).UIswitch pour activer ou désactiver une matrice d'images dans le contrôleur de vue séparée

import UIKit 

class SecondViewController: UIViewController , UIGestureRecognizerDelegate { 

@IBAction func home(_ sender: Any) { 
    performSegue(withIdentifier: "home", sender: self) 
} 

@IBOutlet weak var imgPhoto: UIImageView! 

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

let list1 = List(words:["lake", "lamb", "lamp", "lark", "leaf", "leash", "left", "leg", "lime", "lion", "lips", "list", "lock", "log", "look", "love", "lunch"], active: true) 

let list2 = List(words: ["ladder", "ladybug", "laughing", "lawnmower", "lemon", "leopard", "leprechaun", "letters", "licking", "lifesaver", "lifting", "lightbulb", "lightning", "listen", "llama"], active: true) 

let list3 = List(words: ["alligator", "balance", "ballerina", "balloon", "bowling", "cello", "colors", "curlyhair", "dollar", "dolphin", "elephant", "eyelashes", "gasoline", "goalie", "hula", "jellyfish", "olive", "pillow", "pilot", "polarbear", "rollerskate", "ruler", "silly", "telephone", "television", "tulip", "umbrella", "valentine", "violin", "xylophone", "yellow"], active: true) 

let list4 = List(words: ["apple", "ball", "bell", "bubble", "castle", "fall", "fishbowl", "girl", "owl", "pail", "peel", "pool", "smile", "whale", "wheel"], active: true) 

let list5 = List(words: ["planet", "plank", "plant", "plate", "play", "plum", "plumber", "plus"], active: true) 

let list6 = List(words: ["black", "blanket", "blender", "blocks", "blond", "blood", "blow", "blue"], active: true) 

let list7 = List(words: ["flag", "flipflop", "float", "floor", "flower", "fluffy", "flute", "fly"], active: true) 

let list8 = List(words: ["glacier", "glad", "glasses", "glide", "glitter", "globe", "glove", "glue"], active: true) 

let list9 = List(words: ["clam", "clamp", "clap", "claw", "clean", "climb", "clip", "cloud"], active: true) 

let list10 = List(words:["sled", "sleep", "sleeves", "slice", "slide", "slime", "slip", "slow"], active: true) 

let list11 = List(words: ["belt", "cold", "dolphin", "elf", "golf", "melt", "milk", "shelf"], active: true) 

var imageIndex: Int = 0 

var imageList: [String] { 

    let wordLists = [list1, list2, list3, list4, list5, list6, list7, list8, list9, list10, list11] 



    let active = wordLists.reduce([]) { (result:[String], list:List) in 
     if list.active { 
      return result + list.words 

     } else { 
      return result 
     } 
    } 

    return active 

} 




override func viewDidLoad() { 
    super.viewDidLoad() 

    imgPhoto.image = UIImage(named: imageList[imageIndex]) 

    // 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 = imageList.count - 1 

      } 

      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 > imageList.count - 1 { 

       imageIndex = 0 

      } 

      imgPhoto.image = UIImage(named: imageList[imageIndex]) 

     default: 
      break //stops the code/codes nothing. 
     } 
    } 
} 
} 

MAINTENANT - Je travaille sur une page de paramètres (image ci-dessous). Il y a 1 commutateur pour chacune des 11 listes de mots dans le code ci-dessus. Le plus haut sommet interrupteur contrôlerait list1, le second interrupteur contrôlerait liste2 etc ...

enter image description here

Le problème - est que je veux ajouter des fonctionnalités à chaque commutateur. Lorsqu'un commutateur est en position d'arrêt, le groupe d'images auquel il est associé ne doit pas être inclus dans le tableau final et ne sera pas affiché lorsque l'utilisateur passera les flashcards. Le code de ma page de paramètres est maintenant ci-dessous. J'ai essayé d'expérimenter avec différents bits de code tels que la connexion du commutateur au ViewController et l'ajout d'une fonction Override mais je ne suis pas sûr de savoir où aller à ce stade.

import UIKit 

protocol WordSelectionDelegate: class { 
func wordSelected(newWord: Word) 
} 

class MasterViewController: UITableViewController { 
var words = [Word]() 

weak var delegate: WordSelectionDelegate? 

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


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



override func viewDidLoad() { 
    super.viewDidLoad() 



} 
required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 

    self.words.append(Word(name: "initial /l/ 1 syllable", description: "lake lamb lamp lark leaf leash left leg lime lion lips list lock log look love lunch")) 

    self.words.append(Word(name: "initial /l/ multisyllabic", description: "")) 

    self.words.append(Word(name: "intersyllabic /l/", description: "")) 

    self.words.append(Word(name: "final /l/", description: "")) 

    self.words.append(Word(name: "initial /pl/", description: "")) 

    self.words.append(Word(name: "initial /bl/", description: "")) 

    self.words.append(Word(name: "initial /fl/", description: "")) 

    self.words.append(Word(name: "initial /gl/", description: "")) 

    self.words.append(Word(name: "initial /kl/", description: "")) 

    self.words.append(Word(name: "initial /sl/", description: "")) 

    self.words.append(Word(name: "final /l/ clusters", description: "")) 


} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return self.words.count 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    // Configure the cell... 
    let word = self.words[indexPath.row] 
    cell.textLabel?.text = word.name 
    return cell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt 
    indexPath: IndexPath) { 
    let selectedMonster = self.words[indexPath.row] 
    self.delegate?.wordSelected(newWord: selectedMonster) 
    if let Detail = self.delegate as? Detail { 
     splitViewController?.showDetailViewController(Detail, sender: nil) 
    } 

} 
/* 
// Override to support conditional editing of the table view. 
override func tableView(_ tableView: UITableView, can 

Des idées sur la façon de résoudre ce problème seraient grandement appréciées. Merci

enter image description here

+0

Je ne vois pas dans le code la cible délégué/action de l'UISwitch en cours de définition, vous devez le faire sinon la méthode 'switchAction' ne sera jamais appelée. L'avez-vous fait ailleurs dans votre code? Si vous mettez un point d'arrêt dans cette méthode, est-il jamais appelé? – Mrwerdo

+0

Je suppose que je n'ai pas défini cela. La page des paramètres est un contrôleur de vue partagée, donc il y a d'autres classes qui sont liées à la vue fractionnée mais je n'ai pas mis la méthode d'action du commutateur dans d'autres classes autres que celles ci-dessus. –

Répondre

0

vous manque un certain nombre de pièces à votre programme pour faire ce travail. Ce sont:

  1. Définition de la méthode cible du contrôle UISwitch.
  2. Définition du numéro de tag du contrôle UISwitch.
  3. Actualisation des images présentées dans le SecondViewController.

Pour définir la méthode cible du contrôle UISwitch, vous devrez appeler addTarget(_:action:for:) sur chaque commutateur, en passant la référence à la MasterViewController que vous avez. Si vous le faites, je vous recommande de définir une balise pour votre contrôle UISwitch dans Interface Builder. Par exemple, en supposant que votre UISwitch avait une étiquette de 1:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    // Configure the cell... 
    let word = self.words[indexPath.row] 
    cell.textLabel?.text = word.name 
    if let switchControl = cell.viewWithTag(1) as UISwitch { 
     switchControl.addTarget(self, action: #selector(switchAction(_:)), for: .valueChanged) 
    } 

    return cell 
} 

Pour le point 3, les données de votre MasterViewController est différent de celui dans votre SecondViewController. Vous devez obtenir une référence à votre SecondViewController, puis mettre à jour les données et lui demander de réafficher les images sélectionnées. Voir this question for details sur la façon d'accéder à un contrôleur de vue homologue à partir d'un contrôleur de vue partagée.

+0

Merci. Cependant, les cartes flash ne sont pas affichées dans le contrôleur de vue détaillée. Je vais afficher d'autres informations là-bas. J'ai ajouté une photo de mon storyboard à la question afin que vous puissiez voir la mise en page de l'application.La scène avec le hibou est l'écran d'ouverture puis il y a une segue aux flashcards (la scène avec l'image d'alligator, c'est le SecondViewController). À droite, vous pouvez voir mon contrôleur de vue partagée, c'est la page de paramètres sur laquelle je travaille. Je veux donc passer les informations de MainViewController (page de paramètres) à SecondViewController (scène alligator) –