簡體   English   中英

嘗試滾動時,UITableView崩潰

[英]UITableView crashes when trying to scroll

我在UITableView中的數據有問題。 我有UIViewController,其中包含UITableView插座以及我正在使用的其他東西,並且...起作用:) ...它很可愛,但是...

我創建了一個RSS閱讀器類,該類使用委托將數據部署到表中……再次,如果我只是在主控制器中創建偽數據,那么一切正常!

這行的問題是:rss.delegate = self;

預覽看起來有點破損,而不是Google代碼上的RSS閱讀器文件:

鏈接到GoogleCode上的頭文件

鏈接到Google代碼上的實現文件

我的控制器的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個項目。

希望有人在我變得非常絕望時能夠為我提供幫助,而我認為我還不是一個新手:)

謝謝,

翁德里

我的頭文件的完整副本(表控制器)

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閱讀器)

//
//  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閱讀器)

//
//  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

您的主題說,當您嘗試滾動時會崩潰。 我不知道這與您的rss.delegate有什么關系,所以在這里我將忽略它,只關注可能與滾動相關的錯誤,這些錯誤通常在tableView:cellForRowAtIndexPath:中。

  1. 檢查您的CRFeedCell.xib,查看有關WGTempCell對象的信息,並確保其Identifier字段與代碼中的CellIdentifier匹配。 (“ MyCell”)

  2. 確保您未在​​代碼中其他地方的其他UITableViewCell子類中使用相同的CellIdentifier。

  3. 這是什么崩潰? 如果是EXC_BAD_ACCESS,則雙擊您的可執行文件,轉到Arguments,創建一個NSZombieEnabled環境變量,並將其設置為YES。 (完成調試后,請取消選中該選項,以避免內存泄漏。)這將向您顯示當應用崩潰時,您試圖訪問哪個對象。

  4. 在tableView:cellForRowAtIndexPath:中的setText:調用上設置一個斷點。 然后在您的gdb提示符下,鍵入po [d objectForKey:@“ title”]。 確保該對象確實是一個NSString。

在我看來,好像您兩次初始化NSMutableArray數據一樣:首先在initWithContentsOfUrl:中,然后在parsingEnded:中再次。 也許您應該改為在parsingEnded中執行removeAllObjects。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM