2011-07-19 32 views
0

我是初学者在Xcode编码。 我想要得到的是从plist的sectionview中加载tableview。 而我的问题是在我的部分正确放置行。Xcode:问题与表中的部分

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

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

感谢您的非常有用的帮助

+0

super ces commentaires enfrançais! – 2011-07-19 06:18:07

回答

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与一个整数进行比较。 sectionNSIndexPath的类型,不是intNSUInteger,所以你不能这样比较。相反,你可以检索部分和行号,分别:

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

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

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

+0

感谢您的帮助, 但如何检索数组中的正确对象? 我不知道如何使用这两个数字 – a3116b

+0

,因为你只有一个部分,你可能有一个包含数据的数组,只需在'id myDataObject = [myArray objectAtIndex:[indexPath row]];'中选取值。此外,如果我的答案符合您的需求,请不要忘记单击左侧的复选标记;)([FAQ](http://stackoverflow.com/faq)) – 2011-07-19 07:13:44