web-dev-qa-db-fra.com

Swift - Contrôle segmenté - Basculement de plusieurs vues

Jusqu'à présent, je ne pouvais toujours pas comprendre comment passer de plusieurs vues à la fois. Mon storyboard est comme celui-ci.

enter image description here

Pour l'instant, je souhaite intégrer deux vues dans mon contrôleur de vue.

enter image description here

Mon code pour le contrôle segmenté pour basculer deux vues dans un contrôleur de vue jusqu'à présent.

import UIKit

class PopularHistoryViewController: UIViewController {

    @IBOutlet weak var segmentedControl: UISegmentedControl!

    @IBAction func indexChanged(sender: UISegmentedControl) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            NSLog("Popular selected")
            //show popular view
        case 1:
            NSLog("History selected")
            //show history view
        default:
            break; 
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


}

Autre chose, si je mets deux vues dans mon contrôleur, quelle est la meilleure pratique pour le différencier?

S'il vous plaît des conseils. Je vous remercie.

48
Mohammad Nurdin

Vous pouvez utiliser la propriété isHidden de UIView pour afficher/masquer les vues requises. Tout d'abord, vous devez lier les deux vues à IBOutlets via le générateur d'interface.

@IBOutlet weak var historyView: UIView!
@IBOutlet weak var popularView: UIView!

@IBAction func indexChanged(_ sender: UISegmentedControl) {
    switch segmentedControl.selectedSegmentIndex {
    case 0:
        historyView.isHidden = true
        popularView.isHidden = false
    case 1:
        historyView.isHidden = false
        popularView.isHidden = true
    default:
        break;
    }
}

Remarque: il s’appelait hidden in Swift 1 et 2.

41
rakeshbs

Si vous souhaitez effectuer la présentation de l'interface utilisateur dans Xcode pour les deux sous-vues qui se chevauchent, une meilleure solution consiste à utiliser deux UIContainerViewController et à utiliser le même mode de définition de la propriété masquée, comme suggéré dans la réponse ci-dessus.

enter image description here

49
Xiaojun

Tout d’abord, créez deux sorties et connectez le tuyau aux vues de votre ViewController.

@IBOutlet weak var firstView: UIView!
@IBOutlet weak var secondView: UIView!

Et changez le code comme suit:

@IBAction func indexChanged(sender: UISegmentedControl)
{
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        firstView.hidden = false
        secondView.hidden = true
    case 1:
        firstView.hidden = true
        secondView.hidden = false
    default:
        break; 
    }
}

Si vous ne souhaitez pas créer de prises, attribuez aux vues des balises individuelles (Say 101 et 102) et vous pouvez le faire comme:

@IBAction func indexChanged(sender: UISegmentedControl)
{
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        self.view.viewWithTag(101)?.hidden = false
        self.view.viewWithTag(102)?.hidden = true
    case 1:
        self.view.viewWithTag(101)?.hidden = true
        self.view.viewWithTag(102)?.hidden = false
    default:
        break; 
    }
}
6
Midhun MP

Ajoutez les deux vues au contrôleur de vue dans le scénario et définissez l'une d'elles comme étant masquée = oui ou alpha = 0. Lorsque la fonction d'index modifiée est appelée, définissez la vue actuelle à l'écran sur masqué = oui/alpha à 0 et définissez le paramètre vue précédemment cachée à hidden = no/alpha = 1. Cela devrait permettre d’atteindre ce que vous voulez.

1
Pete42

S'il s'agit d'une vue simple, ne faisant pas partie de l'écran, vous pouvez en effet utiliser la propriété isHidden de deux sous-vues de la vue de votre contrôleur de vue. Mais je n'aime pas cette approche car il est difficile de comprendre ce qui se passe avec votre plume quand toutes les sous-vues sont dans une pile. Je voudrais ajouter et supprimer ces deux vues en tant que contrôleurs de vue enfant par programme. C'est la manière la plus propre qui existe, à mon avis. Mais même si vous décidiez d'utiliser uniquement des vues, ne les mettez pas directement dans la vue du contrôleur. Utilisez des plumes, de préférence avec la classe de propriétaire. Et dans de nombreux cas, envisagez de les ajouter et de les contraindre par programme. C'est plus de code, mais aussi plus propre et conserve les ressources.

0
RealNmae

@IBAction func acSegmentAction (_ expéditeur: N'importe lequel) {

    switch acSegmentedControl.selectedSegmentIndex
    {
    case 0:
       // print("addressview selected")

        addressView.isHidden = false
        contactProviderView.isHidden = true
    case 1:
        //print("contact provider selected")

        addressView.isHidden = true
        contactProviderView.isHidden = false
    default:
        break;
    }

    }
0
Sai kumar Reddy