1

我正在开发我的第一个应用程序并开始将我的头撞到墙上。我创建了一个可以输出简单 JSON 的 C# Web API。我正在使用 AFNetworking 并获得有效响应(我相信),现在我想获取这个 JSON 对象并将其转换为 UITable。这是代码。

这是在我看来确实加载了。

- (void)viewDidLoad
{
    [super viewDidLoad];

    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"SMP" accessGroup:nil];
    NSString *password = [keychain objectForKey:(__bridge id)(kSecValueData)];
    NSString *username = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];

    [[APIClient sharedManager] setUsername:username andPassword:password];

    [[APIClient sharedManager] getPath:@"/api/leads_calls/?$top=5&$orderby=CallStart%20desc"parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        self.leads_dict = responseObject;
        self.leads_calls = [[NSMutableArray alloc] init];
        [self.leads_calls addObject:self.leads_dict];

        NSLog(@"%@", self.leads_calls);

        [self.tableView setHidden:NO];
        [self.tableView reloadData];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        // error stuff here
    }];
}

我可以在以下代码中设置断点,然后引发异常:

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

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (self.leads_calls > nil) {
         // Here is where I get the exception
         cell.textLabel.text = [[self.leads_calls objectAtIndex:indexPath.row] objectForKey:@"CallerName"];
    }
    return cell;
}

最后,我在异常时的数组如下所示:

2013-06-06 14:32:11.372 SMP[39846:c07] (
        (
        {
            CallEnd = "2013-06-06T12:20:26";
            CallStart = "2013-06-06T12:11:56";
            CallerName = "xx & xx";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1134514;
        },
        {
            CallEnd = "2013-06-06T11:36:41";
            CallStart = "2013-06-06T11:07:43";
            CallerName = "Las xx    NV";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1134333;
        },
        {
            CallEnd = "2013-06-04T13:09:00";
            CallStart = "2013-06-04T12:58:36";
            CallerName = "xx LAW FI";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1129882;
        },
                {
            CallEnd = "2013-06-03T16:43:31";
            CallStart = "2013-06-03T16:32:32";
            CallerName = "xx xx";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1127940;
        },
                {
            CallEnd = "2013-06-03T07:46:16";
            CallStart = "2013-06-03T07:44:23";
            CallerName = "xx x";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1125648;
        }
    )
)

我会四处走动,猜测 cell.textLabel.text 正在获得一个它不期望的值,但我不知道如何解决这个问题。

4

2 回答 2

1

我认为您的数组中只有一个 NSDictionary 对象,而不是很多。

text您尝试设置的属性UILabel肯定也不是预期的NSString那样。

什么是类responseObject

通过以下方式了解:

NSLog(@"%@", [responseObject class]);

或在调试器中:

po [responseObject class]

还:

self.leads_calls > nil不是Objective-C中的通用约定。self.leads_calls.count > 0更好

编辑

好的,废弃字典leads_dict并执行self.leads_calls = responseObject

然后在cellForRowAtIndexPath做:

cell.textLabel.text = [[self.leads_calls objectAtIndex:indexPath.row] objectForKey:@"CallerName"];

正如你已经知道的那样(在我输入 ha 后意识到)

编辑 2

你需要实现UITableViewDelegate方法

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

确保只有在 UITableView 中创建的单元格数与数组中的对象数匹配。

如果我是你,我也会考虑为你的响应对象创建一个模型类,它可能会让你以后的生活更轻松。

于 2013-06-06T21:49:56.457 回答
1

看到很痛苦,但是您在数组中有字典和数组:

2013-06-06 14:32:11.372 SMP[39846:c07]
(
    (
        {

注意有2个圆括号...

所以,leads_dict它不是真正的字典,它是一个字典数组。两者兼而有之leads_dictleads_calls似乎有点矫枉过正,删除其中一个。确保左边是一个数组并使用它来驱动您的表格视图。

于 2013-06-06T22:03:48.930 回答