0

携帯電話でアプリを実行すると、次のエラーが表示されます。

json を解析して、カスタム セルの 2 列で画像を使用しようとしましたが、スクロール上の画像が正しく配置されていません。

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 の両方を同じ値で使用すると機能します。

:-表示したい出力

:-私のカスタム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;
    }
}
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 ステートメントはパスします。そうでない場合、2 行目に表示されるエラーが発生します。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 は両方とも NSString です。ライン 2 は呼び出されません
  2. d は NSDictionary、d1 は NSString です。2行目が呼び出されます
  3. d は NSString、d1 は NSDictionary です。2行目が呼び出されます
  4. d と d1 は両方とも NSDictionaries です。2号線が呼び出されます。

最初のケースはまったく問題ありません。最後のケースも。ケース 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];
}
于 2013-02-12T07:55:57.117 に答える