2010-04-05 9 views
1

У меня проблема с данными в UITableView. У меня есть UIViewController, который содержит UITableView и несколько вещей, которые я использую, и ... Он работает :) ... он отлично работает, но ...UITableView падает при попытке прокрутки

Я создал класс RSS-читателя, в котором используются делегаты развернуть данные в таблицу ... и еще раз: если я просто создаю фиктивные данные в главном контроллере, все будет работать!

проблема с этой строкой: rss.delegate = self;

изображение выглядит немного сломанный, чем здесь те RSS Reader файлы на коде Google:

(Link to the header file on GoogleCode)

(Link to the implementation file on Google code)

viewDidLoad функции моего контроллера:

IGDataRss20 *rss = [[[IGDataRss20 alloc] init] autorelease]; 
rss.delegate = self; 
[rss initWithContentsOfUrl:@"http://rss.cnn.com/rss/cnn_topstories.rss"]; 

и моими делегатами методы:

- (void)parsingEnded:(NSArray *)result { 
    super.data = [[NSMutableArray alloc] initWithArray:result]; 
    NSLog(@"My Items: %d", [super.data count]); 
    [super.table reloadData]; 
    NSLog(@"Parsing ended"); 
} 

- (void)parsingError:(NSString *)message { 
    NSLog(@"MyMessage: %@", message); 
} 

- (void)parsingStarted:(NSXMLParser *)parser { 
    NSLog(@"Parsing started"); 
} 

Просто уточнить, NSLog (@ «Разбор закончился»); выполняется, и у меня есть 10 элементов в массиве.

Надежда кто-то сможет помочь мне, как я становлюсь довольно отчаянным, и я думал, что я уже не такая салага :)

Спасибо,

Ондрей

Full копия моего файла заголовка (контроллер таблицы)

класс WGTempTableController является UIViewController с выходом таблицы, массив данных и т.д. ...

// 
// CRFeedController.h 
// czReader 
// 
// Created by Ondrej Rafaj on 5.4.10. 
// Copyright 2010 Home. All rights reserved. 
// 

#import <UIKit/UIKit.h> 
#import "WGTempTableController.h" 
#import <IGDataRss20.h> 


@interface CRFeedController : WGTempTableController <IGDataRss20Delegate> { 

    //NSString *startUrl; 

} 

@end 

Полная копия моего файла реализации (таблица контроллера)

Все другие функции, такие как numberOfSectionsInTableView или numberOfRowsInSection в этом WGTempTableController

// 
// CRFeedController.m 
// czReader 
// 
// Created by Ondrej Rafaj on 5.4.10. 
// Copyright 2010 Home. All rights reserved. 
// 

#import "CRFeedController.h" 
#import "WGTempCell.h" 


@implementation CRFeedController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    IGDataRss20 *rss = [[[IGDataRss20 alloc] init] autorelease]; 
    rss.delegate = self; 
    [rss initWithContentsOfUrl:@"http://rss.cnn.com/rss/cnn_topstories.rss"]; 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

- (void)parsingEnded:(NSArray *)result { 
    super.data = [[NSMutableArray alloc] initWithArray:result]; 
    NSLog(@"My Items: %d", [super.data count]); 
    [super.table reloadData]; 
    NSLog(@"Parsing ended"); 
} 

- (void)parsingError:(NSString *)message { 
    NSLog(@"MyMessage: %@", message); 
} 

- (void)parsingStarted:(NSXMLParser *)parser { 
    NSLog(@"Parsing started"); 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

#pragma mark Table view 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"MyCell"; 
    WGTempCell *cell = (WGTempCell *) [table dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CRFeedCell" owner:nil options:nil]; 
     for(id currentObject in topLevelObjects) { 
      if([currentObject isKindOfClass:[WGTempCell class]]) { 
       cell = (WGTempCell *) currentObject; 
       break; 
      } 
     } 
    } 
    NSDictionary *d = [super.data objectAtIndex:indexPath.row]; 
    [[cell cellTitle] setText:[d objectForKey:@"title"]]; 
    return cell; 
} 



- (void)dealloc { 
    [super dealloc]; 
} 


@end 

Полная копия моего файла заголовка (RSS Reader)

// 
// IGDataRss20.h 
// IGFrameworkProject 
// 
// Created by Ondrej Rafaj on 4.4.10. 
// Copyright 2010 Home. All rights reserved. 
// 

#import <Foundation/Foundation.h> 

@class IGDataRss20; 

@protocol IGDataRss20Delegate <NSObject> 

@optional 

- (void)parsingStarted:(NSXMLParser *)parser; 

- (void)parsingError:(NSString *)message; 

- (void)parsingEnded:(NSArray *)result; 

@end 


@interface IGDataRss20 : NSObject { 

    NSXMLParser *rssParser; 
    NSMutableArray *data; 

    NSMutableDictionary *currentItem; 

    NSString *currentElement; 

    id <IGDataRss20Delegate> delegate; 

} 

@property (nonatomic, retain) NSMutableArray *data; 

@property (nonatomic, assign) id <IGDataRss20Delegate> delegate; 


- (void)initWithContentsOfUrl:(NSString *)rssUrl; 

- (void)initWithContentsOfData:(NSData *)inputData; 


@end 

Полная копия моего файла реализации (RSS Reader)

// 
// IGDataRss20.m 
// IGFrameworkProject 
// 
// Created by Ondrej Rafaj on 4.4.10. 
// Copyright 2010 Home. All rights reserved. 
// 

#import "IGDataRss20.h" 


@implementation IGDataRss20 

@synthesize data, delegate; 

- (void)initWithContentsOfUrl:(NSString *)rssUrl { 
    self.data = [[NSMutableArray alloc] init]; 
    NSURL *xmlURL = [NSURL URLWithString:rssUrl]; 
    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
    [rssParser setDelegate:self]; 
    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:NO]; 
    [rssParser parse]; 
} 

- (void)initWithContentsOfData:(NSData *)inputData { 
    self.data = [[NSMutableArray alloc] init]; 
    rssParser = [[NSXMLParser alloc] initWithData:inputData]; 
    [rssParser setDelegate:self]; 
    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:NO]; 
    [rssParser parse]; 
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    [[self delegate] parsingStarted:parser]; 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 
    NSString * errorString = [NSString stringWithFormat:@"Unable to parse RSS feed (Error code %i)", [parseError code]]; 
    NSLog(@"Error parsing XML: %@", errorString); 
    if ([parseError code] == 31) NSLog(@"Error code 31 is usually caused by encoding problem."); 
    [[self delegate] parsingError:errorString]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    currentElement = [elementName copy]; 
    if ([elementName isEqualToString:@"item"]) currentItem = [[NSMutableDictionary alloc] init]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"item"]) { 
     [data addObject:(NSDictionary *)[currentItem copy]]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (![currentItem objectForKey:currentElement]) [currentItem setObject:[[[NSMutableString alloc] init] autorelease] forKey:currentElement]; 
    [[currentItem objectForKey:currentElement] appendString:string]; 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    //NSLog(@"RSS array has %d items: %@", [data count], data); 
    [[self delegate] parsingEnded:(NSArray *)self.data]; 
} 




- (void)dealloc { 
    [data, delegate release]; 
    [super dealloc]; 
} 

@end 

ответ

5

Ваш вопрос говорит, что он падает при попытке прокрутки. Я не знаю, что это должно было бы сделать с вашим rss.delegate, поэтому я просто проигнорирую это и сосредоточусь на вероятных ошибках прокрутки здесь, которые обычно находятся в tableView: cellForRowAtIndexPath :.

  1. Проверьте CRFeedCell.xib, просматривать информацию о вашем объекте WGTempCell, и убедитесь, что его поле идентификатор соответствует вашей CellIdentifier в вашем коде. («MyCell»)

  2. Убедитесь, что вы не используете тот же CellIdentifier для какого-либо другого подкласса UITableViewCell в другом месте вашего кода.

  3. Что это за авария? Если это EXC_BAD_ACCESS, дважды щелкните свой исполняемый файл, перейдите в «Аргументы», создайте переменную среды NSZombieEnabled и установите для нее значение «ДА». (Снимите флажок, когда вы закончите отладку, чтобы избежать утечки памяти.) Это покажет вам, к какому объекту вы пытались получить доступ, когда приложение разбилось.

  4. Установить точку останова на setText: вызвать в таблицеView: cellForRowAtIndexPath :. Затем в командной строке gdb введите po [d objectForKey: @ "title"]. Убедитесь, что объект действительно является NSString.

+0

ОК, большое спасибо. Как я узнал после включения режима зомби «Мне нравится это имя btw», что я пытаюсь получить доступ к удаленному объекту (- [CRFeedController отвечаетSoSelector:]: сообщение отправлено на освобожденный экземпляр 0x1055e20) после поиска CMD + F для «autorelease» Я нашел что инициализация моего rss-класса освобождается, когда заканчивается viewDidLoad. это означает, что каждый раз, когда я пытался прокручивать снова, я не мог снова получить этот объект. Чтобы освободить этот объект, я должен инициализировать этот объект в файле заголовка и выпустить его в функции dealloc. Еще раз спасибо. Ondrej – Ondrej

0

Он смотрит на меня, как если бы вы инициализировать данные NSMutableArray дважды: во-первых, в initWithContentsOfUrl:, а затем снова в parsingEnded:. Возможно, вы должны сделать removeAllObjects в parsingEnded вместо этого.

+0

Это не так, к сожалению, я получаю NSLog (@ «Parsing закончился»); сообщение, я могу видеть данные в таблице, я даже могу щелкнуть по строке, но когда я пытаюсь прокрутить таблицу, она сработает ... – Ondrej

+0

он даже сработает, когда я отключу все в - (void) parsingEnded: (NSArray *) result { //super.data = [[NSMutableArray alloc] initWithArray: result]; // NSLog (@ "Мои элементы:% d", [супер.даты]]; //[super.table reloadData]; NSLog (@ «Parsing закончился»); } – Ondrej

+0

end работает, только если я отключу rss.delegate = self; row :( – Ondrej

Смежные вопросы