- [__ NSCFConstantString allKeys]:无法识别的选择器发送到实例0xf9ac8

时间:2013-02-12 07:27:49

标签: objective-c xcode

我的应用程序在手机上运行时出现此错误:

我只是试图解析一个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相同的值,那就可以了。

: - Output i want to display

: - my custom Resultcell

代码:

- (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;
    }
}

3 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:1)

这是需要查看的大量代码,但我认为这可能是问题所在:

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

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

答案 2 :(得分: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行将被调用。
  5. 第一种情况完全没问题。最后一种情况。在第2和第3种情况下,将在不是NSDictionary的对象上调用allKeys。

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

    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];
    }