我是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'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'est pas totalement cerclée par le pourtour plus foncé et rappelant la forme d'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 :(得分: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
,不是int
或NSUInteger
,因此您无法比较这样。相反,您可以分别使用:
NSUInteger sectionNumber = [indexPath section];
NSUInteger rowNumber = [indexPath row];
然后使用这两个数字,您可以检索数组中的正确对象,并设置单元格的内容。
您可以在Apple的Table View Programming Guide for iOS中找到有用的信息。希望这会有所帮助。