表视图加载错误的数据并导致应用程序崩溃

时间:2012-09-18 15:11:13

标签: ios xcode xcode4 restkit

我正在处理涉及多个表视图的应用程序。该应用程序使用导航控制器,我有一个故事板设置来处理转换。我目前设置了两个视图,一个用于“Regions”,对象类型为“Region”,另一个用于“Categories”,对象类型为“Category”。在每个视图的代码中,我使用RestKit将适当的数据加载到数组中,然后使用该数据数组来创建表。如果先查看,每个视图都可以自行运行。但是,当我转换到一个视图,关闭它,并尝试移动到另一个视图时,我的应用程序崩溃了。显示的异常表明正在将错误类型的数据加载到表的数组中。例如,如果我首先转到Categories视图,然后切换到“Regions”视图,应用程序似乎我的“Regions”数组包含“Category”类型的对象。有没有其他人对表混淆数据的问题?怎么可以解决这个问题?感谢。

编辑 - 以下是将数据加载到表格单元格中的代码,以及一些说明。

如果是第一个要加载的表,则每个表都包含正确的数据。只有在切换到其他表视图时才会发生崩溃。已将异常注释到它们出现的代码中。 “categoryName”和“regionName”是各自类型的属性。

地区:

在顶部,我创建了数组区域:

@interface RegionListingsController () {
    NSArray *regions;
}

Restkit onDidLoadObjects方法:

loader.onDidLoadObjects = ^(NSArray *objects) {
    NSLog(@"Objects Loaded");
    regions = nil;
    regions = objects;
    [self.tableView reloadData];
};

创建表格单元格:

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

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    Region *region = [[Region alloc] init];
    region = nil;
    region = [regions objectAtIndex:indexPath.row];
    NSLog(@"region");
    cell.textLabel.text = region.regionName; // Exception: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Category regionName]: unrecognized selector sent to instance 0xce87240'

    return cell;
}

分类

这大致相同,只是使用类别数组而不是区域数组。 阵:     @interface CategoryListingsController(){         NSArray *类别;     }

onDidLoadObjects:

loader.onDidLoadObjects = ^(NSArray *objects) {
    NSLog(@"Objects Loaded");
    categories = objects;
    objects = nil;
    [self.tableView reloadData];
};

表格单元格:

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

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    Category *category = [[Category alloc] init];
    category = nil;
    category = [categories objectAtIndex:indexPath.row];
    NSLog(@"Category Cell");
    cell.textLabel.text = category.categoryName; // Exception: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Region categoryName]: unrecognized selector sent to instance 0xce87240'
    NSLog(@"Cell returned");

    return cell;
}

1 个答案:

答案 0 :(得分:0)

我猜你正在保留这些物品。这里:

regions = objects;

在这里:

categories = objects;

您可以自己创建一些@properties (nonatomic, retain)regionscategories,然后:

self.regions = objects;

和,

self.categories = objects;

另外,请注意您执行此操作的顺序:

regions = nil;
regions = objects;

categories = objects;
objects = nil;

如果您使用@properties方法,则不需要nil之前的值。也不需要这样做(@properties的事件):

self.categories = objects;
objects = nil;

只需删除第二行。