web-dev-qa-db-fra.com

Comment utiliser des cellules statiques dans UITableView sans utiliser Storyboards?

J'ai un ViewController + xib existant dans mon projet et je souhaite maintenant ajouter un UITableView avec des cellules statiques, comme ceci:

TableView with static cells

Mais lorsque je traîne une UITableView sur mon écran, le menu "Contenu> Statique" de l'inspecteur d'attributs ne s'affiche pas.

J'ai essayé de créer la sous-classe de contrôleur UITableViewController, mais cela ne m'aide pas. Je n'ai toujours pas la possibilité d'utiliser des cellules statiques dans l'inspecteur d'attributs.

J'ai regardé autour de StackOverflow mais je n'ai trouvé aucune réponse à cette question. Toutes les questions existantes concernent des Storyboards (que je n'utilise pas) au lieu de fichiers xib.

Je suppose que Xcode fait une sorte de magie lorsque vous ajoutez un UITableViewController à un storyboard, mais pas lorsque vous modifiez une xib existante pour hériter de UITableViewController.

Des conseils sur la manière d’ajouter une vue sous forme de tableau avec des cellules statiques à un xib existant?

30
Kyle Fox

Les cellules de vue de table statique ne sont disponibles que lors de l'utilisation de storyboards. Cependant, si vous n'utilisez pas de story-boards pour toute votre interface utilisateur, vous pouvez les utiliser pour des écrans individuels au lieu d'une collection d'écrans.

Pour ce faire, vous pouvez créer un fichier UIStoryboard avec un contrôleur de vue unique dont le propriétaire du fichier est défini sur votre sous-classe de contrôleur de vue personnalisé. Définissez l'identifiant du VC sur une valeur. Lorsque vous souhaitez afficher ceci, récupérez le storyboard, puis instanciez votre sous-classe de contrôleur de vue en créant le VC à partir de votre storyboard.

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil];
CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"];

Vous pouvez présenter ce VC comme d'habitude dans votre application.

C'est un excellent moyen de commencer à utiliser des storyboards sans avoir à convertir toute votre application pour pouvoir les utiliser.

45
Colin Humber

Ceci est faisable sans storyboards:

  1. votre contrôleur doit adopter les protocoles pour le délégué tableview et source ... UITableViewDelegate, UITableViewDataSource
  2. Ajouter une vue de table à votre fichier .xib; définir le style de la vue de table sur "groupé"
  3. Connectez la table à une propriété de votre contrôleur (appelons-la "yourTableView")
  4. Ajoutez des cellules de vue de table à .xib en tant que vues séparées ... c.-à-d. not en tant que sous-vues de la vue table ... elles seront flottantes dans le fichier .xib. (voir l'exemple ci-dessous)
  5. Ajoutez des contrôles/étiquettes, etc. aux cellules du tableau.
  6. Attribuez des chaînes uniques au champ "Identifier" dans Attributs pour chaque cellule de la vue tableau.
  7. Connectez les cellules du tableau à d'autres propriétés du contrôleur (sliderCell, switchCell, etc.)
  8. Connectez les événements d'envoi des contrôles de cellules aux méthodes IBAction-ed du contrôleur - (IBAction) handleSliderCell, etc.
  9. Dans la méthode viewDidLoad de votre contrôleur, affectez le délégué et la source de la vue tabulaire au contrôleur (self.yourTableControl.delegate = self; self.yourTableControl.dataSource = self;)
  10. implémenter numberOfSectionsInTableView, numberOfRowsInSection et cellForRowAtIndexPath dans le contrôleur 
  11. dans tableView: cellForRowAtIndexPath :, renvoyez vos pointeurs FirstFell, yourSecondCell, etc. pour obtenir les valeurs indexPath appropriées

Les événements pour les contrôles pour les cellules de tableau doivent aller à vos routines de gestionnaire ...

Exemple pour l'étape 4: xib

25
ordinaryaverageguy

Pour développer la réponse de BVB, en ce qui concerne le numéro 10, voici les extraits de code Swift 3 pour vos méthodes de délégué tableview. Assurez-vous d’ajouter des points de vente à toutes vos cellules du xib.

Lorsque vous créez manuellement vos sections de vue tableau, rappelez-vous que indexPath est égal à un tableau à 2 dimensions représentant la structure de votre table. Par exemple, lorsque indexPath est passé à tableView(cellForRowAt indexPath: IndexPath) est égal à [1][0], votre cellule sera placée à la première position de la deuxième section. 

Les valeurs peuvent être extraites de indexPath avec les propriétés indexPath.row et indexPath.section. En utilisant ces valeurs, vous pouvez construire manuellement vos sections à partir de vos IBOutlets dans l'ordre de votre choix.

@IBOutlet var is_enabled: UITableViewCell!
@IBOutlet var is_public: UITableViewCell!

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    switch(section){
        case 0:
            return "Cell 1"
        case 1:
            return "Cell 2"
        default: return ""

    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    print("index path here", indexPath)
    if(indexPath.section == 0)  {
        return is_enabled
    }
    else if(indexPath.section == 1) {
        return is_public
    } else {
        return is_enabled
    }
}
0
thexande