Как отобразить данные, хранящиеся в NSMutableArray в TableView? - PullRequest
0 голосов
/ 29 августа 2011

Я новичок в программировании iphone.Я использую XML Parser для получения данных, хранящихся в NSMutableArray, и отображения их в TableView.Когда я компилирую, я вижу данные в консоли, используя NSLog, но они не отображаются в tableView на симуляторе.Мне нужна ваша помощь, чтобы решить это, пожалуйста.

    //  XMLParser.m
#import "XMLParser.h"

@implementation XMLParser

- (NSDictionary *)catalogue{
    return catalogue;
}
- (id)parseXMLAtURL:(NSURL *)url
         parseError:(NSError **)error
{
    catalogue = [NSMutableDictionary new];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser parse];
    if([parser parserError] && error) {
        *error = [parser parserError];
    }
    [parser release];
    return self;
}
- (void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName
     attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"Catalogue"]) { 
        categories = [NSMutableArray new];
    }else if([elementName isEqualToString:@"Categorie"]) {
        categorie = [NSMutableDictionary new];
        [categorie setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
        typesProduit = [NSMutableArray new];
    }else if([elementName isEqualToString:@"typeproduit"]) { 
        typeProduit = [NSMutableDictionary new];
        [typeProduit setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
        produits = [NSMutableArray new];
    }else if([elementName isEqualToString:@"produit"]) { 
        produit = [NSMutableDictionary new];
        [produit setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
    }else {
        currentNodeName = [elementName copy];
        currentNodeContent = [[NSMutableString alloc] init];
    }
}
- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    //NSLog(@"Close tag: %@", elementName); 

    if([elementName isEqualToString:@"Catalogue"]) {
        [catalogue setValue:categories forKey:@"categories"];
        [categories release];
        categories = nil;
    }else if([elementName isEqualToString:@"Categorie"]) {
        [categorie setValue:typesProduit forKey:@"typesProduit"];
        [typesProduit release];typesProduit=nil;
        [categories addObject:categorie];
        [categorie release];categorie = nil;
        [typesProduit release];typesProduit=nil;
    }else if([elementName isEqualToString:@"typeproduit"]) {
        [typeProduit setValue:produits forKey:@"produits"];
        [typesProduit addObject:typeProduit];
        [typeProduit release];typeProduit=nil;
        [produits release];produits=nil;
    }else if([elementName isEqualToString:@"produit"]) {
        [produits addObject:produit];
        [produit release];produit=nil;
    }else if([elementName isEqualToString:@"nom"]) {
        [categorie setValue:currentNodeContent forKey:@"nom"];
    }else if([elementName isEqualToString:@"libelle"]) {
        [typeProduit setValue:currentNodeContent forKey:@"libelle"];
    }else {
        [produit setValue:currentNodeContent forKey:elementName];
        [currentNodeContent release];currentNodeContent=nil;
    }
}

- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{   
    [currentNodeContent appendString:string];
}
- (void)dealloc{
    [catalogue release];
    [super dealloc];
}
@end

Ответы [ 3 ]

1 голос
/ 29 августа 2011

См. Справочник классов UITableViewController. Существует также множество учебных пособий по созданию табличных представлений.

Вам необходим класс, соответствующий протоколу UITableViewDataSource. Это может быть любой класс, который вы пишете сами, но UITableViewController соответствует протоколу, поэтому вы можете создать его подкласс, а затем использовать свой подкласс в качестве делегата.

В вашем делегате вам нужно определить следующий метод:

`- (UITableViewCell  *)tableView:(UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath`

Контроллер табличного представления создает само табличное представление, а затем передает его вам, поэтому вам не нужно выделять его самостоятельно.

NSIndexPath - это просто пара целых чисел, один из которых является индексом вашей секции таблицы, а другой - индексом вашей ячейки в этом разделе. В простой таблице будет только один раздел, поэтому первый индекс всегда будет равен нулю, но вы можете иметь столько разделов, сколько захотите.

Вы создаете UITableViewCell, а затем задаете текст свойства textLabel вашей ячейки для строки, которую вы получаете из одного из элементов массива. Существует также detailTextLabel, который может отображать дополнительную информацию в той же ячейке.

С тем, что я вам сказал, Руководство по программированию табличного представления для iOS должно привести вас туда, куда вы хотите.

Обратите внимание, что с табличными представлениями возникают всевозможные проблемы. Конечно, узнайте, как его реализовать и заставить его работать, но если вы обнаружите, что он не выполняет то, что вам нужно, и у вас не слишком много ячеек, рассмотрите возможность использования UIScrollView.

Преимущество UITableViewController заключается в том, что он работает для таблиц практически бесконечного размера. Он удаляет ячейки, когда они прокручиваются сверху или снизу, помещает их в кеш, а затем делает их доступными для повторного использования в cellForRowAtIndexPath. Это означает, что ваша таблица может иметь миллионы строк, оставаясь при этом отзывчивой и занимая лишь немного памяти. Но очень немногие приложения действительно нуждаются в чем-то столь надежном.

0 голосов
/ 29 августа 2011

Если ваши данные прочитаны правильно (проверено NSLog), проблема должна быть в вашем UITableView datasource.

Проверьте ваш cellForRowAtIndexPath: метод.Там вы должны установить для метки ячейки соответствующее имя:

cell.textLabel.text = [yourDataArray objectAtIndex:indexPath.row];

В ваших процедурах синтаксического анализа заполните yourDataArray элементами ваших различных классов (produit, categorie и т. Д.), КоторыеВы хотите отображаться в вашем табличном представлении.

0 голосов
/ 29 августа 2011

Попробуй вот так,

    - (void)parser:(NSXMLParser *)parser
    foundCharacters:(NSString *)string
    {   
    if(currentNodeContent  == null){
    currentNodeContent = [[NSMutableString alloc] init];
    }
else
        [currentNodeContent appendString:string];
    }

удалить currentNodeContent = [[NSMutableString alloc] init]; из этого метода

- (void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName
     attributes:(NSDictionary *)attributeDict 

Я сомневаюсь, что currentNodeContent инициализируется, когда используется вышеуказанный метод

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