2017-09-06 2 views
2

Comment puis-je présenter une vue de manière modale à partir d'un contrôleur de barre d'onglets de manière à ce que la vue dépasse la vue réelle?Présenter une vue de manière modale à partir d'un contrôleur de barre d'onglets

Je souhaite créer une vue avec un appareil photo. Quelque chose comme "WhatsApp" ou "Instagram" où il y a un bouton au milieu que l'utilisateur peut cliquer et la vue de la caméra apparaît.

En outre, l'utilisateur doit déplacer l'onglet qu'il était auparavant lorsque le bouton de fermeture a été cliqué.

This is how my ViewController is connected to the TabBarController

Répondre

3

J'ai dû mettre en œuvre quelque chose de semblable dans une application que je suis en train de construire, il est relativement simple à faire, vous devez implémenter une méthode de délégué de UITabBarController afin d'y parvenir.

La méthode déléguée vous devez mettre en œuvre est: tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool

De retour faux de cette méthode arrête le contrôleur de l'onglet de sélectionner l'onglet, vous suffit alors de mettre en œuvre votre propre logique pour présenter le UIViewController programatically.

Voici un exemple:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 

    // If your view controller is emedded in a UINavigationController you will need to check if it's a UINavigationController and check that the root view controller is your desired controller (or subclass the navigation controller) 
    if viewController is YourViewControllerClass { 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     if let controller = storyboard.instantiateViewController(withIdentifier: "storyboardID") as? YourViewControllerClass { 
      controller.modalPresentationStyle = .fullScreen 
      self.present(controller, animated: true, completion: nil) 
     } 

     return false 
    } 

    // Tells the tab bar to select other view controller as normal 
    return true 
} 

Je n'ai pas testé le code ci-dessus comme ma mise en œuvre est légèrement différent et a plusieurs variables. Le principe général est le même. Faites-moi savoir comment vous allez et je mettrai à jour la réponse si nécessaire.

+0

J'ai utilisé votre code et il ne fonctionne toujours pas comment il aimerait que cela fonctionne. Donc créé une nouvelle classe pour mon TabBarController et collé votre code là-bas. Est-ce que c'est ce que tu voulais dire? Et quelle classe devrais-je écrire au lieu de YourViewControllerClass? Peut-être que vous pouvez jeter un oeil à ma photo, que j'ai liée dans mon message original. –

+0

Hey, vous devrez sous-classer votre 'UITabBarController' et implémenter le' UITabBarDelegate' sur cette classe. Dans 'viewDidLoad', vous devrez faire' self.delegate = self', la méthode ci-dessus sera lancée lorsque vous essaierez de sélectionner un onglet en bas. 'YourViewControllerClass' est la classe associée au contrôleur de vue de votre storyboard (celui de gauche). Vous devrez sous-classer 'UIViewController' et appliquer cette classe à ce contrôleur de vue. – WsCandy

+0

Yeey! Ça marche. Merci beaucoup pour votre aide. J'ai oublié le self.delegate = self.Maintenant, si je veux le fermer avec un bouton, comment puis-je revenir à ViewController était juste avant? –

0
let modalVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerIdentifier") 
    modalVC.modalTransitionStyle = .crossDissolve 
    modalVC.modalPresentationStyle = .full or .overfullscreen // please check which of the options work 
    self.present(modalVC, animated: true, completion: { 

    }) 
+0

Où suis-je censé mettre cet extrait de code? –

0

En supposant que vous êtes conforme à UITabBarControllerDelegate, vous pouvez mettre en œuvre:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 

    // here, you should edit "0" to be matched with your selected item 
    // for instance, if there is 5 items and the desired item is in the middle, the compared value should be "2" 
    if tabBarController.selectedIndex == 0 { 

     // simply, you will need to get the desired view controller and persent it: 
     let desiredStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let desiredViewController = desiredStoryboard.instantiateViewController(withIdentifier: "storyboard id") 

     present(desiredViewController, animated: true, completion: nil) 

    } 
} 
+0

J'ai créé la relation directement dans le storyboard, de sorte que l'élément de la barre d'onglets est créé automatiquement. J'ai donc déjà une vue connectée au contrôleur de la barre d'onglets, cependant, je ne veux pas l'utiliser parce que je ne veux pas changer de vue. Je veux qu'il apparaisse. Que devrais-je faire? –

+0

Pourriez-vous élaborer s'il vous plaît? –

+0

Allez vérifier mon message original. Mon problème est qu'au lieu de présenter la vue de manière modale, elle passe à la vue à cause du TabBarController. Et c'est le cas parce que je l'ai implémenté comme ça, mais maintenant je demande comment ne pas changer la vue mais la montrer de façon modale. Alors qu'il apparaît sur ma vue actuelle. –