开发者

Xcode: Problem with section in tableview

i'm beginner in coding in Xcode. What i want to get is a tableview load from plist with section. And my problem is to place correctly row in my section.

In my plist, i've the name of my section in each entries, but i don't know how to get these information. So i add manualy by code the name of my two section.

my plist look like this :

<dict>
    <key>Root</key>
    <array>
        <dict>
            <key>DESCRIPTION</key>
            <string>Robe ponctuée de petites tâches sombres plus ou moins rondes et pleines tel que l&apos;on retrouve chez le guépard</string>
            <key>TITLE</key>
            <string>Spotted</string>
            <key>IMAGE</key>
            <string></string>
            <key>MINI</key>
            <string>spotted.png</string>
            <key>CAT</key>
            <string>MOTIFS</string>
        </dict>
        <dict>
            <key>DESCRIPTION</key>
            <string>Robe ponctuée de taches plutôt rondes offrant deux tons contrastants. Le centre de celles-ci se voulant plus clair et le pourtour plus sombre. On appelle rosette ouverte une tâche qui n&apos;est pas totalement cerclée par le pourtour plus foncé et rappelant la forme d&apos;un croissant de lune. </string>
            <key>TITLE</key>
            <string>Rosettes ouvertes ou demi-lunes</string>
            <key>IMAGE</key>
            <string></string>
            <key>MINI</key>
            <string>roset-ouv.png</string>
            <key>CAT</key>
            <string>MOTIFS</string>
        </dict>

and here is my rootcontroller.m

//  RootViewController.m
//  FichesRaces
//
//  Created by a3116b on 28/05/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "RootViewController.h"
#import "FichesRacesAppDelegate.h"
#import "CatsList.h"
#import "DetailViewController.h"
#import "NewsCustomCell.h"
#import "InfoViewController.h"

@implementation RootViewController
@synthesize tabWebSites;

- (void)viewDidLoad {
    [super viewDidLoad];





    // Charger le fichier .plist dans un tableau que l'on appelera  arrayFromFile
    NSString *path = [[NSBundle mainBundle] pathForResource:@"cats" ofType:@"plist"];
    NSDictionary *dictFromFile = [[NSDictionary alloc] initWithContentsOfFile:path];
    NSArray *arrayFromFile = [dictFromFile objectForKey:@"Root"];




    // Créons un tableau temporaire que nous allons remplir avec un objet Website par NSDictionnary contenu dans le fichier .plist
    // Notez l'utilisation de NSEnumerator pour parcourir un tableau
    NSMutableArray *websitesToAdd = [[NSMutableArray alloc] init];
    NSEnumerator *enumerator = [arrayFromFile objectEnumerator];
    NSDictionary *anObject;
    while ((anObject = [enumerator nextObject])) {
        CatsList *cl = [[CatsList alloc] initWithDictionaryFromPlist: anObject];
        [websitesToAdd addObject: cl];

        [cl release];
    }

    // Remplir la propriété tabWebSites avec le contenu du NSMutableArray précédent
    self.tabWebSites = [NSArray arrayWithArray:websitesToAdd];

    // Gestion de la mémoire : pour chaque alloc, n'oubliez pas le release qui va avec !
    [websitesToAdd release];
    [arrayFromFile release];
}




- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];


}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}



// définir hauteur cellule

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *) indexPath {

    return 80;
}



// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // On n'a besoin que d'une section pour nos sites Internet
    return 2;
}



//- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
 //   NSArray *sectionTitles =  [[NSArray alloc] 
   //                            initWithObjects:@"Les Motifs", @"Les Couleurs", nil];
  //  return sectionTitles;
//}




- (NSString *)tableView:(UITableView *)tableView 
titleForHeaderInSection:(NSInteger)section
{


    if ( section == 0 ) return @"Les Motifs";
    if ( section == 1 ) return @"Les Couleurs";
    return @"Other";
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Nous ne tenons pas compte du numéro de section puisqu'il n'y en a qu'une
    // Dans cette unique section il y a tous les éléments du tableau, on retourne donc le nombre
   // return [self.tabWebSites count];


    if ( section == 0 ) return 5;
    if ( section == 1 ) return 14;
        return 0;

}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"NewsCustomCellIdentifier";
    NewsCustomCell *cell = (NewsCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NewsCustomCell" owner:self options:nil];
        for (id oneObject in nib) {
            if ([oneObject isKindOfClass:[NewsCustomCell class]]) 
                cell = (NewsCustomCell *)oneObject;
        }
    }    



    // determine the correct row.
    // it will be restarted from 0 every time, and 开发者_StackOverflow社区as
    // we're just loading in from one array, we need to
    // offset it by the right amount depending on the section.
    int theRow = indexPath.row;
    if ( indexPath.section == 1 ) theRow += 6;
    if ( indexPath.section == 2 ) theRow += 19;



    // On récupère l'objet Website qui correspon à la ligne que l'on souhaite afficher
    CatsList *cl = [self.tabWebSites objectAtIndex:indexPath.row];

    // On configure la cellule avec le titre du site et sa description
    cell.textLabel.text = cl.TITLE;
    cell.detailTextLabel.text = cl.DESCRIPTION;

    UIImage *img = [UIImage imageNamed:cl.MINI];    
    cell.imageView.image = img;

    //important ajouter signalisation sinon APP REFUSE

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



    // On renvoie la cellule configurée pour l'affichage
    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    detailVC.CL = [self.tabWebSites objectAtIndex:indexPath.row];

    [self.navigationController pushViewController:detailVC animated:YES];
    [detailVC release];



}
- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload
{
    [super viewDidUnload];

    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}

- (void)dealloc
{
        [super dealloc];
}

@end

thanks for your very useful help


The table view datasource is designed to provide informations to the table view. When it needs to display the values, it asks its data source, how many sections are there, how many rows in a particular section. The method that returns the number of sections, isn't required, and by default will return 1. But this is a good pratice to always implement it. I can understand from the comments in your code, there is only one section.

// not required
-(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
    // you said only one section
    return 1;
}

So, now you return the correct number of sections, the table view needs to know how many rows there are per section (even with only one section), and this takes place in : -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;, which is a required method.

-(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
    // return here the number of rows
    // you have only one, don't check the section number...
    return [self.tabWebSites count];
}

Finally, the data source must return every cell to the table view. I see you try in -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;, to compare section to an integer. section is type of NSIndexPath, is not int or NSUInteger, so you can't compare like this. Instead, you can retrieve the section and row number, respectively with :

NSUInteger sectionNumber = [indexPath section];
NSUInteger rowNumber = [indexPath row];

And then with these two numbers, you can retrieve the correct object in the array, and set the content of the cell.

You will find useful information in Table View Programming Guide for iOS from Apple. Hope this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜