0

我有一个NSMutableArray *rows;我初始化并用viewDidLoad. 在这一点上,显然,它有数据。在这种情况下,三个条目。

然后在里面tableView:cellForRowAtIndexPath我打电话[rows objectAtIndex:indexPath.row]。但是,此时rows数组仍然包含三个条目,但这些条目的值0x00000000不是原始值(例如,'id' was 12345but is now 0x00000000.

在我看来,不知何故,数据的价值在和rows之间的某个地方被清空了。这可能是什么原因造成的?viewDidLoadtableView:cellForRowAtIndexPath

编辑

这是代码:

ViewController.m

@implementation ViewController

NSMutableArray *rows;

- (void)viewDidLoad
{
    rows = [[NSMutableArray alloc] init];
    [rows setArray:myData]; // myData is als an NSMutableArray populated from JSON data.
}

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

{
    User *user = [rows objectAtIndex:indexPath.row]; // At this point 'rows' contains three entries but the values are empty.
}

@end

编辑 2

这是经过几次建议更改后的代码:

视图控制器.m

@interface ViewController()
{
    NSMutableArray *rows;
}

@implementation ViewController
- (void)setRowsFromJSON
{
    NSString *fileContents = [NSString stringWithContentsOfFile:@"data.json" encoding:NSUTF8StringEncoding error:nil];
    NSData *jsonData = [fileContents dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];

    rows = [NSMutableArray arrayWithCapacity:[jsonArray count]];
    User *user;

    for (NSDictionary *aUser in jsonArray) {
        user = [[User alloc] init];
        user.id = [aUser valueForKey:@"id"];
        user.name = [aUser valueForKey:@"name"];
        [rows addObject:user];
    }
}

- (void)viewDidLoad
{
    [self setRowsFromJSON];
}

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

{
    User *user = [rows objectAtIndex:indexPath.row]; // At this point 'rows' contains three entries but the values are empty.
}

@end
4

1 回答 1

1

0x000000000 为零。这意味着该行没有指向任何地方。

我在 iOS 5.1 上运行应用程序时遇到了同样的问题。问题是您假设 viewDidLoad 总是在 tableview:cellForRowAtIndexPath: 之前调用。但这不一定是那样。第一个是视图控制器的方法。第二种是Table View Data Source的方法。两者都是同一个对象的事实是一个意外。

在我的例子中,表视图控制器方法在 viewDidLoad 之前调用,然后在 viewDidLoad 之后再次调用,因为对视图表属性的一些修改总是会重新加载。

尝试在例如 - numberOfSectionsInTableView 中进行初始化:

于 2013-04-26T18:38:31.730 回答