web-dev-qa-db-fra.com

vue de conteneur iOS dans UITableViewCell

J'essaie d'ajouter un autre contrôleur de vue à l'intérieur d'une cellule UITableView. L'idée est que vous appuyez sur la cellule et qu'elle se développe pour afficher plus de contenu - une interface de messagerie. Il est important (je pense) que cela soit contrôlé par un ViewController de messagerie séparé.

Développer la cellule et avoir des vues à l'intérieur de la cellule avec les contraintes appropriées est en réalité très simple dans Storyboards. J'ai donc essayé de tout conserver dans les storyboards en ajoutant mon nouveau VC à la TableViewCell via un conteneur. De cette façon, je pourrais ajouter des contraintes à la vue Conteneur et acheminer le contenu de mon VC Messaging.

Voici l'erreur:

Configuration illégale: les vues de conteneur ne peuvent pas être placées dans des éléments répétés au moment de l'exécution.

N'importe quel moyen de contourner ce problème ou est-il possible de canaliser la vue de mon contrôleur de vue dans cette tableviewcell et de la contraindre à une configuration que j'ai définie dans Storyboards? Je vous remercie!

22
Rob

J'ai eu la même tâche et j'ai décidé de cette façon:

Étape 1. Créer une sous-classe MyCell: UITableViewCell.

Étape 2. Si vous utilisez Self-Sizing Cells, dans InterfaceBuilder, ajoutez UIView à MyCell, puis ajoutez une contrainte de hauteur et des contraintes à tous les côtés. Cette vue est nécessaire pour définir la hauteur de la cellule.
Sinon, ignorez cette étape et utilisez heightForRowAtIndexPath.

 enter image description here  enter image description here

Étape 3. Dans MyCell.h, ajoutez la sortie de la contrainte de hauteur de vue et de la propriété du contrôleur:

@interface MyCell: UITableViewCell

@property (weak, nonatomic) MessagingVC *controller;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

@end

Étape 4. Dans cellForRowAtIndexPath, ajoutez le code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];

    // adjust this for your structure 
    cell.controller = [[UIStoryboard storyboardWithName:@"MessagingVC" bundle:nil] instantiateInitialViewController];

    [self addChildViewController:cell.controller];
    [cell.contentView addSubview:cell.controller.view];
    [cell.controller didMoveToParentViewController:self];

    //  if you use Self-Sizing Cells
    cell.viewHeight.constant = 200; // set your constant or calculate it

    return cell;
}

Étape 5. Ajouter la méthode didEndDisplayingCell:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([cell isKindOfClass:[MessagingVC class]])
         [((MyCell*)cell).controller removeFromParentViewController];
}
18
Igor

Vous pouvez simplement faire glisser la vue conteneur dans UITableVeiw dans le storyboard. Par exemple, vous pouvez le faire glisser avant la cellule prototype et afficher le contrôleur de vue de votre conteneur avant vos cellules prototypes. En passant, vous pouvez faire glisser n’importe quel élément de l’interface utilisateur pour l’afficher sous forme de tableau. Je ne suis pas sûr de savoir comment gérer l'autolayout dans la vue combinaison de vues + conteneur, vous devez peut-être calculer/définir manuellement les contraintes au moment de l'exécution. Je mettrai à jour ma réponse lorsque je trouverai la bonne solution à propos de l'autolayout. 

0
Dima Deplov

Définissez votre contenu UITableViewController sous la forme Static.

enter image description here

0
thatzprem