uitableview在indexpath处抛出错误的访问错误对象

时间:2013-03-30 23:23:50

标签: xcode uitableview

我一直收到这个错误:

2013-03-30 19:48:40.029 try [14838:907] - [__ NSSetM objectAtIndex:]:无法识别的选择器发送到实例0x1e8ea660 2013-03-30 19:48:40.030尝试[14838:907] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSSetM objectAtIndex:]:无法识别的选择器发送到实例0x1e8ea660' * 第一次抛出调用堆栈: (0x33e523e7 0x3bb43963 0x33e55f31 0x33e5464d 0x33dac208 0xe5bc7 0x35cac569 0x35c91391 0x35ca8827 0x35c648c7 0x35a10513 0x35a100b5 0x35a10fd9 0x35a109c3 0x35a107d5 0x35a10639 0x33e27941 0x33e25c39 0x33e25f93 0x33d9923d 0x33d990c9 0x3797733b 0x35cb52b9 0x7b495 0x3bf70b20) libc ++ abi.dylib:terminate调用抛出异常 (lldb)

//继承我的代码:

- (void)fetchTweets
{

    UIApplication* app = [UIApplication sharedApplication];
    app.networkActivityIndicatorVisible = YES;


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:
                        [NSURL URLWithString: @"***.json"]];

        NSError* error;



        tweets = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions
                                                   error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
    });
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return tweets.count;
}

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

    static NSString *CellIdentifier = @"showVideo";

    CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(!cell)
    {
        cell = [[CustomVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 277, 58)];
    av.backgroundColor = [UIColor clearColor];
    av.opaque = NO;
    av.image = [UIImage imageNamed:@"cell_bg.png"];
    cell.backgroundView = av;


    UIImage *image = [UIImage   imageNamed:@"disclosure_arrow_white.png"];
    UIImageView *av2 = [[UIImageView alloc] initWithFrame:CGRectMake(44.0, 44.0, image.size.width, image.size.height)];
    av2.backgroundColor = [UIColor clearColor];
    av2.opaque = NO;
    av2.image = [UIImage imageNamed:@"disclosure_arrow_white.png"];
    cell.accessoryView = av2;



    NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];


    cell.title.text = [tweet objectForKey:@"title"];


    NSLog(@"t: %@",[tweet objectForKey:@"title"]);


    return cell;

}

2 个答案:

答案 0 :(得分:1)

您可以尝试保留tweets

tweets = [[NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions
                                                   error:&error] retain];

以及之后的release dealloc。我猜它是一个自动释放的对象被分配给它。

答案 1 :(得分:0)

行后:

CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

您需要检查该单元格是否实际具有值,如果不存在,则创建一个新单元格。

CustomVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell)
{
  cell = [[CustomVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier];
}
祝你好运!

更新您的新错误:

JSONObjectWithData产生的'tweets'变量是NSDictionary,而不是NSArray。由于NSDictionary没有实现'objectAtIndex',因此抛出了无法识别的选择器异常。通常情况下,推文字典应该包含一个包含推文数组的键,您应该将其分配给fetchTweets方法中的“tweets”变量。

如果你不确定我所指的很多东西,那么我强烈建议你使用Sensible TableView框架。该框架将能够自动为您提取所有Web服务推文,并自动在表视图中显示它们。我个人现在总是使用它,节省了大量的手工劳动。