cellForRowAtIndexPath:尝试访问数组时遇到崩溃objectAtIndex:indexPath.row

时间:2010-05-30 09:38:57

标签: iphone uitableview nsindexpath

我从自定义UITableView(自己的类和笔尖)将数据加载到UITableViewCell。它工作得很好,直到我尝试访问某些数组的objectAtIndex:indexPath.row

我会先发布我的代码,你可能会更容易理解我的意思。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[CustomCell class]]){
                cell = (CustomCell *) currentObject;
                break;
            }
        }
    }
    // Configure the cell...
    NSUInteger row = indexPath.row;
    cell.titleLabel.text = [postsArrayTitle objectAtIndex:indexPath.row];
    cell.dateLabel.text = [postsArrayDate objectAtIndex:indexPath.row];
    cell.cellImage.image = [UIImage imageWithContentsOfFile:[postsArrayImgSrc objectAtIndex:indexPath.row]];

    return cell;
}

奇怪的是,当它在前三个单元格中加载时它确实有效(它们是130px高),但在我尝试向下滚动时崩溃。 (Aka,日志在崩溃前显示三个数字,0, 1, 2

因此,作为摘要,objectAtIndex:indexPath.row成功运行3 * 3次,但当我尝试在应用中向下滚动,加载新单元格时,应用程序崩溃时出现以下错误:< /强>

2010-05-30 14:00:43.122 app[2582:207] -[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x5a44bf0
2010-05-30 14:00:43.124 app[2582:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x5a44bf0'
// Stack
    0   CoreFoundation                   0x02398c99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x024e65de objc_exception_throw + 47
    2   CoreFoundation                  0x0239a7ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                  0x0230a496 ___forwarding___ + 966
    4   CoreFoundation                  0x0230a052 _CF_forwarding_prep_0 + 50
    5   myappname                        0x00002ab1 -[HomeTableViewController tableView:cellForRowAtIndexPath:] + 605

有关阵列的其他信息:

数组是在.h文件中创建的:

NSArray *postsArrayDate;
NSArray *postsArrayTitle;
NSArray *postsArrayComments;
NSArray *postsArrayImgSrc;

填写viewDidLoad:

NSURL *urlPosts = [NSURL URLWithString:@"http://mysite/myphpfile.php?posts=2"]; //returns data in this format: DATA1#Data1.1#data1.2~DATA2#data2.1#~ and so on.
NSError *lookupError = nil;
NSString *data = [[NSString alloc] initWithContentsOfURL:urlPosts encoding:NSUTF8StringEncoding error:&lookupError];
postsData = [data componentsSeparatedByString:@"~"];
[data release], data = nil;
urlPosts = nil;
postsArrayDate = [[postsData objectAtIndex:2] componentsSeparatedByString:@"#"];
postsArrayTitle = [[postsData objectAtIndex:3] componentsSeparatedByString:@"#"];
postsArrayComments = [[postsData objectAtIndex:4] componentsSeparatedByString:@"#"];
postsArrayImgSrc = [[postsData objectAtIndex:5] componentsSeparatedByString:@"#"];

如何修复此崩溃?

2 个答案:

答案 0 :(得分:3)

**我遇到了同样的问题,解决了“自我”问题。数组修复了它。 **

<小时/> NSArray只表示“ObjectAtIndex:#”的单个实例,最终被视为NSString。在创建NSArray时,我创建了tempArray,用对象填充它,将它设置为等于MyArray,释放的tempArray。但设置它等于“MyArray = tempArray;”失败。需要使用“self.MyArray = tempArray;”来处理数组OBJECT它100%有效!!

答案 1 :(得分:0)

实际错误是:

-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x5d10c20

换句话说,您尝试在objectAtIndex:NSString)上运行NSCFString,这当然不支持此方法。

您可以按以下方式致电objectAtIndex:三次:

cell.titleLabel.text = [postsArrayTitle objectAtIndex:indexPath.row];
cell.dateLabel.text = [postsArrayDate objectAtIndex:indexPath.row];
cell.cellImage.image = [UIImage imageWithContentsOfFile:[postsArrayImg objectAtIndex:indexPath.row]];

因此,postsArrayTitlepostsArrayDatepostsArrayImg似乎不是NSArray,而是NSString