Xcode: проблема с разделом в табличном представлении - PullRequest
0 голосов
/ 19 июля 2011

Я новичок в кодировании в Xcode. То, что я хочу получить - это загрузка таблицы из 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 голосов
/ 19 июля 2011

Источник данных табличного представления предназначен для предоставления информации табличному представлению. Когда ему нужно отобразить значения, он спрашивает свой источник данных, сколько разделов есть, сколько строк в определенном разделе. Метод, который возвращает количество разделов, не требуется, и по умолчанию возвращает 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];

И затем с этими двумя числами вы можете получить правильный объект в массиве и установить содержимое ячейки.

Полезную информацию вы найдете в Руководство по программированию табличного представления для iOS от Apple. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...