[Résolu] Click ouvre un tableView compliqué

busterTheobusterTheo Membre
août 2015 modifié dans Dev. iOS, watchOS, tvOS #1

Bonjour,


je préfère poser la question avant de m'engager sur une mauvaise piste.


 


Je dois faire ça.


 


Dois-je faire une tableView ? À savoir que dans d'autres écrans, je dois faire la même chose avec d'avantage de cells ?


 


Et j'en ai pas mal comme ça.


 


Je ne vais pas quand même créer tout ça dans IB.


 


Et si je dois faire des tableView (en code évidemment - quoique...!), comment faire les deux parties gauche/droite ?


 


J'ai pris le temps de réféchir, d'analyser le truc, et avant de perdre trop de temps à  de faire 50 essais, j'aimerai bien avoir quelques indications.


 


Merci de m'aider.


 


Mots clés:

Réponses

  • Si tu parles de la popup qui s'affiche, tu as plusieurs solutions qui dépendent de tes contraintes.


     


    Est-ce que tu as seulement 6 éléments dans la popup ? Est-ce que c'est susceptible de changer ?


     


    Moi j'irais sur un collectionView qui s'adapte bien dans ce cas. On voit que c'est davantage axé sur l'image, avec un titre descriptif en dessous.


    Tu peux changer facilement le nombre d'éléments pour l'adapter à  tes besoins.


     


    Tu peux placer 6 boutons aussi. ça marche aussi.

  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2015 modifié #3

    J'ai utilisé une UITableView dans un popover pour faire comme la première image ci-joint.


     


    Et, plus complique, une UITableView de trois cellules dans une autre UITableView de deux cellules comme la deuxième image ci-joint


     


    Toutes les deux étant fait dans les storyboard, sans code  8--)


  • Je suis d'accord avec Joanna. C'est la solution la plus simple je pense. Puis si tu veux vraiment compliquer le tout, faire un truc vraiment custom à  fond, créer une vue .xib que tu load depuis ton code lorsque tu cliques sur un bouton.


  • Merci pour vos réponses.


     


    J'ai plusieurs types de présentations de ce type et différentes en même temps sur plusieurs écrans.


    Notamment avec plusieurs colonnes, et plusieurs doubles lignes (parfois). Donc rien de répétitif.


     


    Je suis donc parti, déjà  dans un premier temps à  essayer de monter un xib et de le faire apparaà®tre dans un popover.


     


    C'est pas gagné, mais je progresse bien.


     


    Ensuite, ce sera trop compliqué de faire des tablesViews ou collectionViews.


    De toutes façons, le nombre d'éléments (nbre de lignes) de chaque liste est fixe une bonne fois pour toutes.


    Je monte donc tout ça en views dans des views avec des views dans des views, etc d;-)


     


    Car c'est trop compliqué avec des table ou collection, vu que parfois je dois avoir des lignes avec deux sous-choix.


    Enfin bref, c'est trop bordellique comme créa et concept de base.


    Je pense que le mieux c'est du dur dans un xib (appelé dans le popover), puis des clicks/choix et tests true/false.


     


    Quand je suis au point, je vous renvoi un lien vidéo.


     


    Pour l'instant j'en suis là  :



    func tapLigneSourireField() {
    println("tapLigneSourireField TABLEVIEW a faire")

    let largeurbouches2a = CGFloat(170)
    let hauteurbouches2a = CGFloat(252)

    bouches2aViewController.modalPresentationStyle = .Popover
    bouches2aViewController.preferredContentSize = CGSizeMake(largeurbouches2a, hauteurbouches2a)

    let popoverBouches2aViewController = UIPopoverController(contentViewController: bouches2aViewController)
    popoverBouches2aViewController.dismissPopoverAnimated(true)

    popoverBouches2aViewController.presentPopoverFromRect(champLigneSourire.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)

    bouches2a = Bouches2a(frame: CGRect(x: 0, y: 0, width: largeurbouches2a, height: hauteurbouches2a))

    Et j'ai mon popover - Pas sur le champs cliqué, mais au milieu de l'écran. Drôle, non ?


    C'est certainement normal, je le concède, je verrais cela demain.


     


    Encore merci

  • DrakenDraken Membre
    août 2015 modifié #6

    Les tablesView et les collectionView c'est pour les cas où le contenu "informationnel" d'un composant graphique est plus grand que sa dimension physique, donc scrolling. 


  • CéroceCéroce Membre, Modérateur

    Ensuite, ce sera trop compliqué de faire des tablesViews ou collectionViews.

    Faut voir. Parce que UITableView et UICollectionView gèrent la notion de sélection.
    Gérer ça à  la main me semble bien plus fastidieux que créer une UITableView.

  •  


     


    plus grand que sa dimension physique, donc scrolling

    Oui, ce qui n'est pas le cas ici.



     


     


    Gérer ça à  la main me semble bien plus fastidieux que créer une UITableView

    Pas mal de lignes de codes, c'est vrai, mais une fois que l'on a le principe, on peut le réutiliser à  souhait.


    Voici un exemple, avec un popover custom (pas de popover apple) et un choix parmi trois labels qui se répercute dans le champ :



    // MARK: Configuration des Champs

    func configChampsFille2() {
    let champsColor = UIColor(red: 252/255, green: 252/255, blue: 252/255, alpha: 1.0)
    champForcer = UITextField(frame: CGRectMake(60, 350, 175, 34))
    champForcer.userInteractionEnabled = true
    champForcer.addTarget(self, action: "tapForcerField", forControlEvents: UIControlEvents.EditingDidBegin)
    champForcer.backgroundColor = champsColor
    champForcer.font = UIFont(name: "Lato-Lig", size: 16.0)
    champForcer.textColor = UIColor.lightGrayColor()

    champForcer.inputView = UIView(frame: CGRectZero)

    // Champ Forcer
    if listeDesVariables.e1L3ForcerString != "" {
    champForcer.text = listeDesVariables.e1L3ForcerString
    } else {
    champForcer.text = ""
    champForcer.placeholder = "Forcer :"
    }

    champForcer.borderStyle = .RoundedRect
    champForcer.tintColor = UIColor.clearColor()
    viewFille2Etapes.addSubview(champForcer)

    roueResultat()
    }

    // MARK: Configuration des labels

    func tapForcerField() {
    popUpFieldForcer = PopUpField(frame: CGRectMake(120, 283, 200, 110))
    popUpFieldForcer.backgroundColor = UIColor.clearColor()
    viewFille2Etapes.addSubview(popUpFieldForcer)

    configLabelsPopUpForcer()
    }

    func configLabelsPopUpForcer() {
    let labelsColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1.0)
    label1Forcer = UILabel(frame: CGRectMake(165, 280, 140, 40))
    label1Forcer.backgroundColor = UIColor.clearColor()
    label1Forcer.text = labelsChamps[0]
    label1Forcer.font = UIFont(name: "Arial", size: 14.0)
    label1Forcer.textColor = labelsColor
    label1Forcer.textAlignment = .Left
    viewFille2Etapes.addSubview(label1Forcer)

    let tapGesturelabel1Forcer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "label1ForcerTap:")
    label1Forcer.userInteractionEnabled = true
    label1Forcer.addGestureRecognizer(tapGesturelabel1Forcer)

    label2Forcer = UILabel(frame: CGRectMake(165, 312, 140, 40))
    label2Forcer.backgroundColor = UIColor.clearColor()
    label2Forcer.text = labelsChamps[1]
    label2Forcer.font = UIFont(name: "Arial", size: 14.0)
    label2Forcer.textColor = labelsColor
    label2Forcer.textAlignment = .Left
    viewFille2Etapes.addSubview(label2Forcer)

    let tapGesturelabel2Forcer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "label2ForcerTap:")
    label2Forcer.userInteractionEnabled = true
    label2Forcer.addGestureRecognizer(tapGesturelabel2Forcer)

    label3Forcer = UILabel(frame: CGRectMake(165, 345, 140, 40))
    label3Forcer.backgroundColor = UIColor.clearColor()
    label3Forcer.text = labelsChamps[2]
    label3Forcer.font = UIFont(name: "Arial", size: 14.0)
    label3Forcer.textColor = labelsColor
    label3Forcer.textAlignment = .Left
    viewFille2Etapes.addSubview(label3Forcer)

    let tapGesturelabel3Forcer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "label3ForcerTap:")
    label3Forcer.userInteractionEnabled = true
    label3Forcer.addGestureRecognizer(tapGesturelabel3Forcer)
    }


    func label1ForcerTap(recognizer: UITapGestureRecognizer) {
    let tap = recognizer as UITapGestureRecognizer
    switch(tap.state) {
    case .Began:
    let recognizerY = recognizer.locationInView(label1Forcer).y as CGFloat
    case .Changed:
    let recognizerY = recognizer.locationInView(label1Forcer).y as CGFloat
    case .Ended:
    let recognizerY = recognizer.locationInView(label1Forcer).y as CGFloat
    champForcer.text = labelsChamps[0]
    listeDesVariables.e1L3ForcerString = labelsChamps[0]
    popUpFieldForcer.removeFromSuperview()
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()
    resultatRoue.removeFromSuperview()
    roueResultat()
    enregistrer()
    default:
    break
    }
    }

    func label2ForcerTap(recognizer: UITapGestureRecognizer) {
    let tap = recognizer as UITapGestureRecognizer
    switch(tap.state) {
    case .Began:
    let recognizerY = recognizer.locationInView(label2Forcer).y as CGFloat
    case .Changed:
    let recognizerY = recognizer.locationInView(label2Forcer).y as CGFloat
    case .Ended:
    let recognizerY = recognizer.locationInView(label2Forcer).y as CGFloat
    champForcer.text = labelsChamps[1]
    listeDesVariables.e1L3ForcerString = labelsChamps[1]
    popUpFieldForcer.removeFromSuperview()
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()
    resultatRoue.removeFromSuperview()
    roueResultat()
    enregistrer()
    default:
    break
    }
    }

    func label3ForcerTap(recognizer: UITapGestureRecognizer) {
    let tap = recognizer as UITapGestureRecognizer
    switch(tap.state) {
    case .Began:
    let recognizerY = recognizer.locationInView(label3Forcer).y as CGFloat
    case .Changed:
    let recognizerY = recognizer.locationInView(label3Forcer).y as CGFloat
    case .Ended:
    let recognizerY = recognizer.locationInView(label3Forcer).y as CGFloat
    champForcer.text = labelsChamps[2]
    listeDesVariables.e1L3ForcerString = labelsChamps[2]
    popUpFieldForcer.removeFromSuperview()
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()
    resultatRoue.removeFromSuperview()
    roueResultat()
    enregistrer()
    default:
    break
    }
    }

    func supprimeRecognizerLabelsForcer() {
    if label1Forcer.gestureRecognizers != nil {
    for gesture in label1Forcer.gestureRecognizers! {
    if let recognizer = gesture as? UITapGestureRecognizer {
    label1Forcer.removeGestureRecognizer(recognizer)
    }
    }
    }
    if label2Forcer.gestureRecognizers != nil {
    for gesture in label2Forcer.gestureRecognizers! {
    if let recognizer = gesture as? UITapGestureRecognizer {
    label2Forcer.removeGestureRecognizer(recognizer)
    }
    }
    }
    if label3Forcer.gestureRecognizers != nil {
    for gesture in label3Forcer.gestureRecognizers! {
    if let recognizer = gesture as? UITapGestureRecognizer {
    label3Forcer.removeGestureRecognizer(recognizer)
    }
    }
    }
    label1Forcer.removeFromSuperview()
    label2Forcer.removeFromSuperview()
    label3Forcer.removeFromSuperview()
    popUpFieldForcer.removeFromSuperview()
    }
  • Joanna CarterJoanna Carter Membre, Modérateur
    S'il te plaà®t m'excuser mais si t'es tellement limité par une date de livraison, je ne peux pas comprendre pourquoi tu continues à  écrire tous ce code. ça met beaucoup plus de temps que d'utiliser les XIBs/storyboards et, en plus, avec tous les "magic numbers", s'il fallait changer quelque chose, ça mettrait encore plus de temps.
  • Oui, je suis désolé, mais c'était juste un exemple. ça fait longtemps que je l'ai fait, ce truc, et effectivement, je dois y revenir.


     


    Je suis justement, sur les conseils des barmen, en train de travailler sur tous les magic numbers du projet et plein de trucs à  refaire en xib.


     


    Comme j'ai encore plein d'écrans à  construire, je pense que je vais gagner du temps. Mais pour l'instant, ça patine un peu, car j'ai fait pas mal d'erreur de conception.


     


    Encore merci pour les conseils.

Connectez-vous ou Inscrivez-vous pour répondre.