0

当我在手机上运行我的应用程序时,我收到此错误:

我只是试图解析一个 json 并尝试在自定义单元格的两列中使用图像,但是我在滚动上的图像放错了位置。

int index=indexPath.row*2;
int newindex=index+1;

NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];    
NSLog(@"NSDictionary *u = [results objectAtIndex:index] %@",u);

NSDictionary *u1 = [[results objectAtIndex:newindex]mutableCopy];
NSLog(@"NSDictionary *u1 = [results objectAtIndex:newindex] %@",u1);

但是,如果我同时使用 index 和 newindex 相同的值,它就可以工作。

:-我要显示的输出

:-我的自定义结果单元

代码 :

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil suffix:(NSString *)_suffix{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.suffix = _suffix;
    }
    return self;
}

#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)_tableView{
    return 1;
}


//my new
- (NSInteger)tableView:(UITableView *)_tableView numberOfRowsInSection:(NSInteger)section{
    int resultCount = [results count];
    labelResultsCount.text = [NSString stringWithFormat:@"%d",resultCount];
    return resultCount/2;
}
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   // NSString* CellIdentifier = [NSString stringWithFormat:@"ident_%d",indexPath.row];

    static NSString *CellIdentifier = @"ResultCell";
    ResultCell *cell = (ResultCell *)[_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil){
        NSArray *a = [[NSBundle mainBundle] loadNibNamed:@"ResultCell" owner:self options:nil];
        cell = (ResultCell *)[a objectAtIndex:0];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }   

    int index=[(indexPath.row*2) copy];
    int newindex=[(index+1) copy];


    // save badge in dictionaory and get here and show in lable

    NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];

    NSLog(@"NSDictionary *u = [results objectAtIndex:newindex] %@",u);



   NSDictionary *u1 = [[results objectAtIndex:newindex]mutableCopy];

    NSLog(@"NSDictionary *u1 = [results objectAtIndex:indexPath.row*2+1 newindex] %@",u1);


    @try {
        /* fullName */
        NSString *nickName = [u objectForKey:@"nickName"];
        cell.labelName.text = nickName;


        NSString *nickName1 = [u1 objectForKey:@"nickName"];
        cell.labelName1.text = nickName1;

        /* chat notification*/

        cell.imageViewNotification.hidden=0;
        cell.imageViewNotification1.hidden=0;

        NSString *badge = [u objectForKey:@"badge"];
        NSString *badge1 = [u1 objectForKey:@"badge"];



        if([badge intValue]>0)
        {
            cell.imageViewNotification.hidden=0;
            cell.labelNotification.text = badge;
            NSLog(@"inside > 0 %@",badge);


        }
        else if([badge intValue]<=0) 
        {
            cell.imageViewNotification.hidden=1;
            cell.labelNotification.text=@"";
            NSLog(@"%@",badge);



        }



        if([badge1 intValue]>0)
        {
            cell.imageViewNotification1.hidden=0;
            cell.labelNotification1.text = badge1;
            NSLog(@"inside > 0 %@",badge1);


        }
        else if([badge1 intValue]<=0) 
        {
            cell.imageViewNotification1.hidden=1;
            cell.labelNotification1.text=@"";
            NSLog(@"%@",badge1);



        }


        /*..................*/


        /* distance */
        id distance = [u objectForKey:@"distance"];
        if([distance isKindOfClass:[NSString class]]){
            cell.labelDistance.text = distance;
            cell.imageViewDistance.hidden = 0;
        }else{
            cell.imageViewDistance.hidden = 1;
            cell.labelDistance.text = @"";
        }


        id distance1 = [u1 objectForKey:@"distance"];
        if([distance1 isKindOfClass:[NSString class]]){
            cell.labelDistance1.text = distance1;
            cell.imageViewDistance1.hidden = 0;
        }else{
            cell.imageViewDistance1.hidden = 1;
            cell.labelDistance1.text = @"";
        }
        /* online */
        NSNumber *online = [u objectForKey:@"online"];
        cell.imageViewOnline.image = [online intValue] ? [UIImage imageNamed:@"circle_online.png"] : [UIImage imageNamed:@"circle_offline_red.png"];


        NSNumber *online1 = [u1 objectForKey:@"online"];
        cell.imageViewOnline1.image = [online1 intValue] ? [UIImage imageNamed:@"circle_online.png"] : [UIImage imageNamed:@"circle_offline_red.png"];

        /* buttonProfile */

        id d = [u objectForKey:@"thumbnails"];
        id d1 = [u1 objectForKey:@"thumbnails"];

        if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
            if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){
                NSString *imageSuffix = [d objectForKey:@"icon"];
                NSString *imageSuffix1 = [d1 objectForKey:@"icon"];
                NSLog(@"[d allKeys] count]%@", d);
                NSLog(@"[d1 allKeys] count]%@", d1);

                UIImage *image = [[SharingCenter sharedManager] imageFromCache:imageSuffix];
                UIImage *image1 = [[SharingCenter sharedManager] imageFromCache:imageSuffix1];
                if(image||image1)
                {
                    [cell.buttonUserProfile setBackgroundImage:image forState:UIControlStateNormal];
                    [cell.buttonUserProfile1 setBackgroundImage:image1 forState:UIControlStateNormal];
                }
                else{
                    NSString *gender = [u objectForKey:@"gender"]; 
                    NSString *gender1 = [u1 objectForKey:@"gender"]; 

                    UIImage *profileDefualtImage = [gender isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];

                    UIImage *profileDefualtImage1 = [gender1 isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];


                    [cell.buttonUserProfile setBackgroundImage:profileDefualtImage forState:UIControlStateNormal];
                    [cell.buttonUserProfile1 setBackgroundImage:profileDefualtImage1 forState:UIControlStateNormal];



                    /* downlowd Image */
                    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",WebServicePrefix,imageSuffix]];
                    __block
                    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
                    request.delegate = self;
                    [request setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].latitude] forKey:@"lat"];
                    [request setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].longitude] forKey:@"lon"];
                    //  [[[SharingCenter sharedManager] imagesCache] removeAllObjects];

                    [request setCompletionBlock:^{
                        NSData *imageData = [request responseData];
                        if(imageData){
                            UIImage *image = [UIImage imageWithData:imageData];
                            if(image){


                                [[[SharingCenter sharedManager] imagesCache] setObject:image forKey:imageSuffix];

                                if([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]){
                                    ResultCell *cell = (ResultCell *)[self.tableView cellForRowAtIndexPath:indexPath];
                                    [cell.buttonUserProfile setBackgroundImage:image forState:UIControlStateNormal]; 
                                }
                            }
                        }
                    }];
                    [request setFailedBlock:^{
                        NSError *error = request.error;
                        NSLog(@"%@",error);
                    }];

            /* downlowd Image */
            NSURL *url1 = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",WebServicePrefix,imageSuffix1]];
            __block
            ASIFormDataRequest *request1 = [ASIFormDataRequest requestWithURL:url1];
            request1.delegate = self;
            [request1 setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].latitude] forKey:@"lat"];
            [request1 setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].longitude] forKey:@"lon"];
            //  [[[SharingCenter sharedManager] imagesCache] removeAllObjects];

            [request1 setCompletionBlock:^{
                NSData *imageData1 = [request1 responseData];
                if(imageData1){
                    UIImage *image1 = [UIImage imageWithData:imageData1];
                    if(image1){

                        [[[SharingCenter sharedManager] imagesCache] setObject:image1 forKey:imageSuffix1];

                        if([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]){
                            ResultCell *cell = (ResultCell *)[self.tableView cellForRowAtIndexPath:indexPath];
                            [cell.buttonUserProfile1 setBackgroundImage:image1 forState:UIControlStateNormal]; 
                        }
                    }
                }
            }];
            [request1 setFailedBlock:^{
                NSError *error = request1.error;
                NSLog(@"%@",error);
            }];
                    [[self networkQueue] addOperation:request];
                    [[self networkQueue] addOperation:request1];




        }
     }
    }


    else{
            NSString *gender = [u objectForKey:@"gender"];
        NSString *gender1 = [u1 objectForKey:@"gender"];

            UIImage *profileDefualtImage = [gender isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
            [cell.buttonUserProfile setBackgroundImage:profileDefualtImage forState:UIControlStateNormal];


        UIImage *profileDefualtImage1 = [gender1 isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
        [cell.buttonUserProfile1 setBackgroundImage:profileDefualtImage1 forState:UIControlStateNormal];
        }       

        /* pickStatus */
        NSNumber *pickStatus = [u objectForKey:@"pick_status"];
        NSNumber *pickStatus1 = [u1 objectForKey:@"pick_status"];

        switch ([pickStatus intValue]) {
            case 0:
                cell.imageViewBorder.image = [UIImage imageNamed:@"border_yellow_transperent.png"];
                cell.buttonUserPick.enabled = 1;
                [cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];


                break;
            case 1:
                cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick.enabled = 0;
                [cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_wait.png"] forState:UIControlStateDisabled];



                break;
            case 2:
                cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick.enabled = 1;
                [cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
                break;
            case 3:
                cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick.enabled = 0;
                [cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_date.png"] forState:UIControlStateDisabled];



                break;
            default:
                break;
        }



        switch ([pickStatus1 intValue]) {
            case 0:
                cell.imageViewBorder1.image = [UIImage imageNamed:@"border_yellow_transperent.png"];
                cell.buttonUserPick1.enabled = 1;
                [cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];


                break;
            case 1:
                cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick1.enabled = 0;
                [cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_wait.png"] forState:UIControlStateDisabled];



                break;
            case 2:
                cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick1.enabled = 1;
                [cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
                break;
            case 3:
                cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
                cell.buttonUserPick1.enabled = 0;
                [cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_date.png"] forState:UIControlStateDisabled];



                break;
            default:
                break;
        }
    }
    @catch (NSException * e) {
        NSLog(@"%@",e);
    }
    @finally {
        return cell;
    }
}
4

3 回答 3

1

NSDictionary您可能正在某处对这些对象做某事,阅读它们的allKeys. 但我的猜测是,您尝试从该results数组中获取的对象不是NSDictionary对象,而是NSString对象。

尝试记录他们的class属性以查看您正在处理的内容(当然,您也可以通过查看 JSON 来发现这一点)。

NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];
NSLog(@"u Class: %@", [u class]);

另外,您为什么要将mutableCopy对象权授予非可变NSDictionary对象。

使用以下应该可以正常工作:

NSDictionary* u = [results objectAtIndex:index];
NSLog(@"u Class: %@", [u class]);
于 2013-02-12T07:43:32.257 回答
1

有很多代码需要查看,但我认为这可能是问题所在:

if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
            if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){

如果 d 或 d1 是字典,则此 if 语句将通过。如果不是,则会导致您在第二行看到的错误。记录 d 和 d1 的类以查看它们是否都是字典。

于 2013-02-12T07:55:22.917 回答
1

有根据的猜测:

此行会导致您的问题:

if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
    if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){

第一个 if 的结果有 4 种不同的可能性:

  1. d 和 d1 都是 NSStrings。不会调用第 2 行
  2. d 是 NSDictionary,d1 是 NSString。将调用第 2 行
  3. d 是 NSString,d1 是 NSDictionary。将调用第 2 行
  4. d 和 d1 都是 NSDictionaries。将调用第 2 行。

第一种情况完全没有问题。最后一个案例也没有。如果 2 和 3 allKeys 将在不是 NSDictionary 的对象上调用。

您可能应该将其替换为需要两个测试都为真的“如果”。

if([d isKindOfClass:[NSDictionary class]] && [d1 isKindOfClass:[NSDictionary class]]){
                                          ^^

另一种选择是单独检查。

if([d isKindOfClass:[NSDictionary class]]) {
   x = [d allKeys];
}
if([d1 isKindOfClass:[NSDictionary class]]) {
   x = [d1 allKeys];
}
于 2013-02-12T07:55:57.117 回答