Xcode:tableview中的部分问题

时间:2011-07-19 06:08:44

标签: xcode tableview

我是Xcode编码的初学者。 我想得到的是来自plist with section的tableview加载。 我的问题是在我的部分正确排行。

在我的plist中,我在每个条目中都有我的部分名称,但我不知道如何获取这些信息。所以我通过代码添加manualy我的两个部分的名称。

我的plist看起来像这样:

<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>

这是我的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 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

感谢您提供非常有用的帮助

1 个答案:

答案 0 :(得分:0)

表视图数据源旨在为表视图提供信息。当需要显示值时,它会询问其数据源,有多少部分,特定部分中有多少行。返回部分数量的方法不是必需的,默认情况下将返回1.但这是一个总是实现它的良好实践。 我可以从您的代码中的注释中了解到,只有一个部分。

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

所以,现在你返回正确数量的部分,表视图需要知道每个部分有多少行(即使只有一个部分),这发生在:-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;,这是一个必需方法。

-(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];
}

最后,数据源必须将每个单元格返回到表视图。我看到您在-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;中尝试将section与整数进行比较。 section类型为NSIndexPath,不是intNSUInteger,因此您无法比较这样。相反,您可以分别使用:

检索节和行号
NSUInteger sectionNumber = [indexPath section];
NSUInteger rowNumber = [indexPath row];

然后使用这两个数字,您可以检索数组中的正确对象,并设置单元格的内容。

您可以在Apple的Table View Programming Guide for iOS中找到有用的信息。希望这会有所帮助。