Jusqu'à présent, je ne pouvais toujours pas comprendre comment passer de plusieurs vues à la fois. Mon storyboard est comme celui-ci.
Pour l'instant, je souhaite intégrer deux vues dans mon contrôleur de vue.
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.
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.
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.
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;
}
}
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.
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.
@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;
}
}