web-dev-qa-db-fra.com

Comment créer visuellement et utiliser des cellules statiques dans un UITableView incorporé dans un UIViewController

J'utilise XCode 4.2 et j'ai construit mon interface utilisateur à l'aide de Storyboards. Je dois créer une vue dont le contenu se situe au-dessus et au-dessous d'un UITableView et je peux y parvenir en utilisant un UIViewController. Un UITableViewController ne vous permet pas d'ajouter du contenu au-dessus ou en dessous du tableau. Vous pouvez utiliser l'en-tête/pied de page du tableau, mais cela ne fonctionne pas pour ce que j'aimerais réaliser.

J'ai maintenant un UIViewController avec un UITableView intégré. Je peux ajuster la hauteur et la largeur de l'UITableView en conséquence, ce qui me donne la disposition de l'interface utilisateur que je recherche.

Je peux personnaliser les cellules statiques dans UITableView mais quand j'essaye de construire j'obtiens l'erreur suivante:

Configuration illégale: les vues de table statiques ne sont valides que lorsqu'elles sont incorporées dans des instances UITableViewController

Ma question est de savoir comment les autres peuvent-ils contourner cela? Créer une table avec des cellules statiques et les disposer visuellement est très agréable mais apparemment, cela n'est pas autorisé pour une raison que je ne peux pas comprendre. Je ne peux pas passer à un UITableViewController en raison de mes exigences de présentation visuelle.

Toute assistance sera grandement appréciée.

53
StinkyDuck

Tu as raison. Dans le storyboard, vous ne pouvez pas avoir une tableView avec des cellules statiques incorporées dans un viewController. Une façon de contourner cela (je ne l'ai pas essayé moi-même, donc je ne suis pas sûr si cela fonctionne) peut être de créer une instance de UITableViewController dans le storyboard avec des cellules statiques. Ajoutez une instance d'UIView à votre viewController, puis chargez par programme la tableView de l'UITableViewController dans l'UIView de votre viewController.

5
Canopus

Vous pouvez y parvenir dans Xcode 4.5 et versions ultérieures, en supposant que votre application cible iOS 6+.

Dans le Storyboard, créez simplement un UIViewController avec un conteneur de vue à l'intérieur de sa vue principale. Connectez ensuite ce conteneur de vues à un UITableViewController qui contient des cellules statiques.

Juste comme ça:

enter image description here

Vous n'avez pas besoin d'une seule ligne de code. Il suffit de contrôler le clic, de faire glisser et de sélectionner l'intégration. Le confinement du contrôleur de vue est géré pour vous.

134
Pedro Mancheno

la réponse de pmd fonctionne mais dans le cas où une compatibilité descendante avec iOS 5 est également requise, vous pouvez effectuer l'intégration par programmation à l'aide de l'API View Containment.

Dans la méthode viewDidLoad de votre parent UIViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MyTableViewController* vc =[storyboard instantiateViewControllerWithIdentifier:@"MyTableVC"];
    [self addChildViewController:vc];
    [self.view addSubview:vc.view];

    // ensure embedded view is aligned to top
    CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    vc.view.frame = frame;

    [vc didMoveToParentViewController:self]; 
}

N'oubliez pas de spécifier un ID de storyboard pour votre UITableViewController avec les cellules statiques.

5
Ken Toh

Je sais que c'est une vieille question, mais j'ai une solution scrappy à ce problème.

J'avais besoin de 3 cellules statiques sur un UIViewController donc c'est ce que j'ai fait:

  1. Faites glisser des cellules de vue tabulaire dans votre interface (pas dans UITableView) - ajoutez du texte et tout ce dont vous avez besoin.
  2. Faites des propriétés IBOutlet pour vos cellules et synthétisez-les.
  3. Faites glisser un bouton et faites-le couvrir toute la cellule. Réglez le bouton sur "Personnalisé" pour qu'il apparaisse invisible - répétez pour toutes les cellules
  4. Ajoutez des balises numériques à vos boutons
  5. Implémentez les fonctions suivantes. buttonDown est connecté à l'événement "Touch Down" des boutons. buttonUp est connecté à 'Touch Up Inside' ET 'Touch Up Outside'

    -(IBAction)buttonDown:(id)sender {
        if ([sender tag] ==  1) {
            myFirstCell.selected = YES;
        }
        else if ([sender tag] ==  2) {
            mySecondCell.selected = YES;
        }
        else if ([sender tag] ==  3) {
            myThirdCell.selected = YES;
        }
    }
    
    -(IBAction)buttonUp:(id)sender {
        myFirstCell.selected = NO;
        mySecondCell.selected = NO;
        myThirdCell.selected = NO;
    }
    

Vous pouvez faire tout ce que vous voulez dans l'événement buttonDown et utiliser le bouton pour accéder directement à une nouvelle vue. Je trouve cela assez utile.

3
Patrick