Ajout de cellules par programme à UITableView

Je viens de commencer à programmer pour l'iPhone et je crée une application qui se connecte à une database et obtient un set de noms de lignes et les affiche. Lorsque cette option est sélectionnée, les lignes changent de couleur d'arrière-plan, ce qui signifie que vous pouvez effectuer plusieurs sélections et que toutes les colors seront différentes. Donc je récupère le XML du server sans problème et j'ai créé un UITableView pour afficher les cellules. Cependant, je n'ai aucune idée de comment append les cellules dans la table. J'ai jeté un oeil à insertRowsAtIndexPaths mais je ne suis pas sûr de savoir comment l'utiliser? Si je comprends bien, insertRowsAtIndexPaths prend deux parameters:

Un NSArray qui contient la ligne dans laquelle la cellule est censée être et dans quelle section. Le problème avec ceci est que mon application aura un nombre dynamic de lignes. Comment pourrais-je créer le NSArray si je ne sais pas combien de lignes j'aurai? Puis-je utiliser NSMutableArray?

Le deuxième paramètre est une animation – c'est assez simple.

Un autre problème que je suis est de savoir où je crée réellement les cellules? Comment passez-vous les cellules à la tableview?

J'ai essayé de lire la documentation mais ça n'a pas l'air très clair! Voici le code que j'ai pour le moment dans la méthode loadview du controller de vue:

  //Before this I get the XML from the server so I am ready to populate //cells and add them to the table view NSArray *cells = [NSArray arrayWithObjects: [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0], [NSIndexPath indexPathForRow:2 inSection:0], [NSIndexPath indexPathForRow:3 inSection:0], [NSIndexPath indexPathForRow:4 inSection:0], [NSIndexPath indexPathForRow:5 inSection:0], [NSIndexPath indexPathForRow:6 inSection:0], [NSIndexPath indexPathForRow:7 inSection:0], [NSIndexPath indexPathForRow:8 inSection:0], [NSIndexPath indexPathForRow:9 inSection:0], [NSIndexPath indexPathForRow:10 inSection:0], [NSIndexPath indexPathForRow:11 inSection:0], [NSIndexPath indexPathForRow:12 inSection:0], nil]; [eventTypesTable beginUpdates]; [eventTypesTable insertRowsAtIndexPaths:cells withRowAnimation:UITableViewRowAnimationNone]; [eventTypesTable endUpdates]; 

Je pense que vous approchez de cela dans la mauvaise direction. UITableViews ne fonctionne pas comme prévu. insertRowsAtIndexPaths est pour insert de nouvelles lignes dans une table, plutôt que pour le insertRowsAtIndexPaths dans la première instance.

UITableViews fonctionne en appelant un certain nombre de methods de délégué qui vous permettent de présenter vos données à la vue de table comme vous le souhaitez. Le framework s'occupe ensuite de la lourde charge pour peupler les cellules, gérer les events de défilement et de toucher, etc.

Je vous recommand de commencer par lire un tutoriel comme celui-ci: http://www.iosdevnotes.com/2011/10/uitableview-tutorial/ , qui me semble assez approfondi. Il explique comment définir votre source de données pour la table et comment vous pouvez configurer la façon dont vos données sont présentées par UITableView.

Bonne chance!

Vous n'avez pas besoin d'utiliser insertRowsAtIndexPaths .

Check: reference de protocole UITableViewDataSource et reference de class UITableView

La magie se produit entre ces trois methods (methods de protocole UITableViewDataSource):

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

Vous avez juste besoin de remplir un tableau. Oui, il peut s'agir d'un NSMutableArray .

Vous pouvez remplir le tableau dans - (void)viewDidLoad , par exemple:

 yourItemsArray = [[NSMutableArray alloc] initWithObjects:@"item 01", @"item 02", @"item 03", nil]; 

Et ils utilisent les methods de source de données comme ceci:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. // If You have only one(1) section, return 1, otherwise you must handle sections return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return [yourItemsArray count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSSsortingng *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell... cell.textLabel.text = [NSSsortingng ssortingngWithFormat:[yourItemsArray objectAtIndex:indexPath.row]]; return cell; } 

Comme cela, les cellules seront créées automatiquement.

Si vous chagez le tableau, il suffit d'appeler:

 [self.tableView reloadData]; 
 //######## Adding new section programmatically to UITableView ############ @interface MyViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> { IBOutlet UITableView *tblView; int noOfSection; } -(IBAction)switchStateChanged:(id)sender; @end @implementation MyViewController - (id)initWithNibName:(NSSsortingng *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad{ [super viewDidLoad]; noOfSection = 2; } - (void)viewDidUnload{ [super viewDidUnload]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { return YES; } return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } #pragma mark - TableView Delegate Methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return noOfSection; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 1; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ if(indexPath.section == 2){ return 200; } return 50; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSSsortingng *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; UISwitch *switchBtn = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 20, 10)]; cell.accessoryView = switchBtn; [switchBtn addTarget:self action:@selector(switchStateChanged:) forControlEvents:UIControlEventValueChanged]; cell.textLabel.font = [UIFont systemFontOfSize:14]; cell.detailTextLabel.font = [UIFont systemFontOfSize:11]; cell.textLabel.numberOfLines = 2; cell.detailTextLabel.numberOfLines = 2; } if(indexPath.section == 0){ cell.textLabel.text = @"Cell-1 Text"; cell.detailTextLabel.text = @"Cell-1 Detail text"; } else if(indexPath.section == 1){ cell.textLabel.text = @"Cell-2 Text"; } else { // new added section code is here... cell.textLabel.text = @"New Added section"; } [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; return cell; } -(IBAction)switchStateChanged:(id)sender{ UISwitch *switchState = sender; if(switchState.isOn == YES){ NSLog(@"ON"); NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2]; [self insertNewSectionWithIndexPath:indexPath]; } else { NSLog(@"OFF"); [self removeSectionWithIndexPath:[NSIndexPath indexPathForRow:0 inSection:2]]; } } -(void)insertNewSectionWithIndexPath:(NSIndexPath *)indexPath{ noOfSection = 3; [tblView insertSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade]; } -(void)removeSectionWithIndexPath:(NSIndexPath *)indexPath{ noOfSection = 2; [tblView deleteSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade]; } @end 

Vous n'avez pas à vous en préoccuper. les cellules seront créées automatiquement. il suffit de regarder ces references de class UITableview

Tableview_iPhone

Vous devez implémenter UITableView dataSource et déléguer Protocol. Regardez également ce didacticiel UITableview Tutorial