0

我已经使用这种方法完成了我的应用程序,我正在实施的最后一个调用是一个简单的 JSON 响应,我需要对其进行解析,它给了我:

[__NSCFString objectAtIndexedSubscript:]: 无法识别的选择器发送到实例 0x17005caa0'

这个网站上有很多类似这样的问题,但我正在按照他们的指示做所有事情,但仍然没有运气。
它是 responseObject 中的嵌套 JSON。我得到了 responseObject,这意味着我发送的请求是正确的。

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error){
        if (!error) {
            if (response) {
                allResponse = [[NSMutableArray alloc] init];
                allPractice = [[NSMutableArray alloc] init];
                allProvider = [[NSMutableArray alloc] init];

                allFirstName = [[NSMutableArray alloc] init];
                allMiddleName = [[NSMutableArray alloc] init];
                allLastName = [[NSMutableArray alloc] init];
                allPracticeName = [[NSMutableArray alloc] init];

                allResponse = responseObject;
                allPractice = [allResponse valueForKey:@"Practice"];
                allProvider = [allResponse valueForKey:@"Provider"];

                allFirstName = [allProvider valueForKey:@"FirstName"];
                allMiddleName = [allProvider valueForKey:@"MiddleName"];
                allLastName = [allProvider valueForKey:@"LastName"];
                allPracticeName = [allPractice valueForKey:@"PracticeAlias"];

                [self.tableView reloadData];
                [SVProgressHUD dismiss];

            }}

这是我作为 ResponseObjects 得到的结构。

{
    AccountType = 2;
    CreatedBy = smith;
    CreatedDate = "2016-01-25T02:07:42.45";
    DisplayName = ",  ";
    Email = "<null>";
    ErrorMessage = "<null>";
    FirstName = "<null>";
    ID = 1;
    IsActive = 1;
    Password = test;
    Phone = "<null>";
    Practice =     {
PracticeAlias = “SAMPLE MEDICAL GROUP";
};
    PracticeAlias = "<null>";
    PracticeCode = "<null>";
    PracticeID = 1;
Provider =     {
    AccountType = 0;
    CreatedBy = smith;
    LastName = John;
    MiddleName = "";
    FirstName = Smith;
};
    Staff = "<null>";
    lstPractice = "<null>";
    lstProvider = "<null>";
    pageSize = 0;
}

所以cellForRowAtIndexPath当我这样做时:

NSLog(@"%@", [NSString stringWithFormat:@"%@",allPracticeName[indexPath.row]]);

该应用程序因我在上面分享的消息而崩溃。

4

2 回答 2

2

看两条线

            allResponse = [[NSMutableArray alloc] init];
            allResponse = responseObject;

那是胡说八道。您将 allResponse 设置为新创建的可变数组,然后将其替换为 responseObject。并且没有任何检查。任何意外数据都会使您的应用崩溃。

您应该将 responseObject 设为 NSDictionary* - 然后检查它是否确实是 NSDictionary*。不要使用 valueForKey ,除非你能给出一个很好的理由,而不是仅仅使用 responseObject [@"Practice"]。并检查这些类型。

于 2016-11-11T16:26:35.373 回答
1

allPracticeName是类型NSString(值为“< null >”)。[]您正在此字符串上调用下标运算符:

allPracticeName[indexPath.row]

NSString没有下标实现。

删除下标:

NSLog(allPracticeName);
于 2016-11-11T13:28:47.167 回答