10 votes

Pourquoi je ne peux pas placer les vues Master et Detail l'une à côté de l'autre dans UISplitViewController lors de la première exécution, mais après rotation, cela fonctionne ?

J'ai un contrôleur à vue divisée qui a une liste d'éléments sur la gauche et une vue détaillée sur la droite. Code pertinent dans AppDelegate :

let splitViewController = mainView.instantiateViewControllerWithIdentifier("initial") as! UISplitViewController

        let rightNavController = splitViewController.viewControllers.last as! UINavigationController
        let detailViewController = rightNavController.topViewController as! DetailsIpad

        let leftNavController = splitViewController.viewControllers.first as! UINavigationController
        let masterViewController = leftNavController.topViewController as! MainViewController

        masterSplitViewController = masterViewController
        detailSplitViewController = detailViewController

        // Override point for customization after application launch.
        let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
        navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
        splitViewController.delegate = self

        self.window!.rootViewController = splitViewController

Lorsque je lance l'application pour la première fois, je constate que la partie droite de l'écran partagé occupe tout l'écran :

enter image description here

Si je fais pivoter l'écran, il devient correctement réglé (probablement parce que les deux vues sont présentes sur l'écran) :

enter image description here

Lorsque je place des points d'arrêt partout, je constate que la vue détaillée de droite est chargée avant la vue principale de gauche (liste des éléments), bien qu'elle ne soit pas appelée directement. Je ne peux pas changer l'ordre dans lequel les vues de l'écran partagé sont appelées. Comment puis-je résoudre ce problème ?

UPDATE :

Je suis en mesure de définir ce paramètre avant de montrer le contrôleur de vue fractionné :

splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

Et dans le ViewDidLoad du contrôleur split lorsque je l'imprime :

print(self.preferredDisplayMode.rawValue)

Je reçois : 2, qui est AllVisible. Mais le résultat est toujours le même.

4voto

Tarun Tyagi Points 1581

C'est le comportement par défaut de UISplitViewController . Regardez bien ce qui suit.

// An animatable property that controls how the primary view controller is hidden and displayed. A value of `UISplitViewControllerDisplayModeAutomatic` specifies the default behavior split view controller, which on an iPad, corresponds to an overlay mode in portrait and a side-by-side mode in landscape.
@property (nonatomic) UISplitViewControllerDisplayMode preferredDisplayMode NS_AVAILABLE_IOS(8_0);

Voici la partie clé de la même définition-

sur un iPad, correspond à un mode superposé en portrait et à un mode côte à côte en paysage.

De même, si vous souhaitez interroger l'état actuel (mode d'affichage) d'un fichier de type UISplitViewController vous devriez utiliser cette propriété-

// The actual current displayMode of the split view controller. This will never return `UISplitViewControllerDisplayModeAutomatic`.
@property (nonatomic, readonly) UISplitViewControllerDisplayMode displayMode NS_AVAILABLE_IOS(8_0);

Et rappelez-vous, vous ne pouvez pas comparer ça avec UISplitViewControllerDisplayModeAutomatic parce que

Cela ne reviendra jamais UISplitViewControllerDisplayModeAutomatic .

Ma suggestion serait de définir preferredDisplayMode à la valeur que vous voulez. Dans votre cas, il semble que vous ayez besoin que le primaire (maître) soit toujours visible. Voici donc la solution proposée-

mySplitVC.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible

Pourquoi charge-t-il d'abord le contrôleur secondaire (détail) ?

Comme vous pouvez le voir, un UISplitViewController L'instance a toujours besoin d'une vue détaillée, peu importe displayMode il se trouve actuellement. C'est donc un bon appel pour

  • charger d'abord la vue détaillée.
  • charger la vue primaire après (conditionnellement basé sur displayMode).

J'espère que cela vous aidera.

0voto

Async- Points 1335

Merci @Tarun Tyagi pour l'explication, mais dans mon cas, les actions suggérées n'ont pas fonctionné. Cependant, ceci a fonctionné pour moi : dans le SplitViewController, j'ai ajouté un appel pour setNeedsLayout() :

override func viewDidAppear(animated: Bool) {
    self.view.setNeedsLayout()
}

Cela permettra de rafraîchir la vue lorsque celle-ci est déjà à l'écran.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X