web-dev-qa-db-fra.com

Bouton Ajouter sur UITableViewController (Swift)

J'essaie d'ajouter un bouton au sommet d'une vue de la table du contrôleur uitableview. Le contrôleur de vue a un contrôleur de navigation et des cellules statiques, ce qui explique pourquoi il s'agit d'un contrôleur de vue uitable et non d'un contrôleur de vue. J'essaie maintenant d'ajouter un bouton au bas de l'écran qui est attaché au contrôleur de navigation pour qu'il ne défile pas avec la vue Tableau.

J'essaie de faire quelque chose de similaire à ce qui est ci-dessous. Il a un contrôleur de navigation pour la barre supérieure, une vue de tableau avec des cellules statiques et ensuite un bouton, mais comment ont-ils fait le bouton?

Image: http://postimg.org/image/ilsmqqrip/

Merci!

UPDATE: Comment utiliser un contrôleur uiview avec une vue de table avec des cellules statiques à l'aide de Swift?

10
zach

Je trouve Container Views très utile dans ce scénario! Une solution propre et très facile à mettre en œuvre.

Créez simplement un UIViewController normal, ajoutez votre bouton et un ContainerView en tant que sous-vues de ce UIViewController (le milieu dans l'image ci-dessous). Enfin, créez Incorporer Segue from ContainerView à votre UITableViewController (celui de droite).

 Storyboard

De cette façon, vous pouvez utiliser des prototypes de cellules statiques sans vous limiter à UITableView en même temps.

Résultat:

 Result

13
andrew_frank

J'ai fait quelque chose de similaire avec UITableViewController et une source de données statique. J'ai ajouté le bouton dans l'aperçu des pieds de mon tableau.

Pour l'aligner au bas de l'écran, j'avais besoin de ce code dans mon contrôleur de vue:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Make footerview so it fill up size of the screen
       // The button is aligned to bottom of the footerview 
       // using autolayout constraints
        self.tableView.tableFooterView = nil
        self.footerView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.tableView.frame.size.height - self.tableView.contentSize.height - self.footerView.frame.size.height)
        self.tableView.tableFooterView = self.footerView
    }

En bref, je redimensionne la vue des pieds pour occuper tout l’espace restant après la suppression de la taille du contenu de la vue tableau. Puisque le bouton est aligné au bas de la footerView avec autolayout, il restera au bas de l'écran.

Le storyboard:

Storyboard

Voici le résultat:

simulator

5
knutigro

il y a une meilleure solution pour cela. Pour ce faire, vous pouvez désactiver la propriété Mise en page automatique (button.translatesAutoresizingMaskIntoConstraints = false) du bouton correspondant ou de tout bouton UIView pour le bouton flottant:

Swift 4

//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
let button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(nextButton)

//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
     button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
     button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}
3
manukn

UITableViewController occupera tout l'espace, vous ne pourrez donc pas ajouter le bouton. Refacturez votre code basé sur UITableViewController dans UIViewController avec UITableView ajouté manuellement. De cette façon, vous pourrez définir la taille de la vue de votre tableau et placer le bouton en bas. 

2
MirekE

Malheureusement, UITableViewController a une tableView comme vue de niveau supérieur. Bien sûr, si vous regardez dans le débogueur de vue, vous pouvez voir que la vue table n'est pas la vue racine. Par conséquent, vous pouvez ajouter les boutons à la fenêtre de la tableView par programme. Si vous devez le faire après coup, c'est probablement le moyen le plus simple d'ajouter un élément de niveau supérieur à un UITableViewController. Sinon, si vous le faites dans la conception initiale, vous pouvez utiliser la vue conteneur pour vos boutons et un UITableViewController pour le TableView. L'inconvénient de cette approche est que vous vous retrouvez avec deux contrôleurs de vue, l'un pour le conteneur et l'autre pour la table, et qu'il est souvent nécessaire de transmettre des informations en retour et entre eux. Si vous utilisez Swift, vous pouvez simplifier cela en imbriquant le contrôleur tableView dans la classe de contrôleur de vue du conteneur. 

Si vous souhaitez ajouter un bouton à la fenêtre, vous pouvez le faire paresseusement une fois que vous êtes certain que la vue a une fenêtre. Notez que les boutons appartiennent à la fenêtre et non au contrôleur de vue. Il vous appartient donc de les supprimer lorsque le contrôleur de vue disparaît.

    private weak var button: UIButton!
    ...
    override func didMove(toParentViewController parent: UIViewController?) {
        super.didMove(toParentViewController: parent)
        guard self.button == nil, let window = tableView.window else {
            return
        }
        let button = UIButton(frame: CGRect(x:0, y:40, width: 200, height: 20))
        button.setTitle("This is a red button", for: .normal)
        button.backgroundColor = UIColor.red
        window.addSubview(button)
        self.button = button
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        button?.removeFromSuperview()
    }
0
Josh Homann