在 cellForRowAtIndexPath 中使用 NSLog 获取 NSCFString objectAtIndexedSubscript

Getting NSCFString objectAtIndexedSubscript with NSLog in cellForRowAtIndexPath

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

[__NSCFString objectAtIndexedSubscript:]: unrecognized selector sent to instance 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]]);

应用崩溃并显示我在上面分享的消息。

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

allPracticeName[indexPath.row]

但是NSString没有下标实现。

去除下标:

NSLog(allPracticeName);

看两条线

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

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

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