0

私はUITebleView衣装を持っていUITableViewCellsます。それらを更新するたびに、コンテンツ自体が並べ替えられます。誰かが理由を知っていますか?

私は JSON からデータを取得しています。ある種の並べ替えは行っていません。TableViewCell indexpath.row に従ってデータを表示するだけです。

そして、これは私が UITableViewCell コンテンツを設定したコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *costumeCell = @"Cell";

    StoreCell *cell = [tableView dequeueReusableCellWithIdentifier:costumeCell];

    if (!cell) {
        cell = [[StoreCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:costumeCell];
    }

    NSDictionary *dict;
    dict = [application objectAtIndex:indexPath.row];

    [downloadQueue addOperationWithBlock:^{

        name = [dict objectForKey:@"name"];
        detileName = [dict objectForKey:@"detailName"];
        itmsLink = [dict objectForKey:@"itms-serviceLink"];
        icon = [dict objectForKey:@"icon"];
        developer = [dict objectForKey:@"developer"];
        version = [dict objectForKey:@"version"];
        category = [dict objectForKey:@"category"];
        rating = [dict objectForKey:@"rating"];
        ratingNumbers = [dict objectForKey:@"ratingNumber"];
        description = [dict objectForKey:@"description"];
        developerEmails = [dict objectForKey:@"developerEmail"];

        cell.AppName.text = name;
        cell.category.text = category;
        cell.rater.text = [NSString stringWithFormat:@"(%@)", ratingNumbers];
        if ([rating intValue] == 1) {
            cell.rating.image = [UIImage imageNamed:@"1.png"];
        }
        if ([rating intValue] == 2) {
            cell.rating.image = [UIImage imageNamed:@"2.png"];
        }
        if ([rating intValue] == 3) {
            cell.rating.image = [UIImage imageNamed:@"3.png"];
        }
        if ([rating intValue] == 4) {
            cell.rating.image = [UIImage imageNamed:@"4.png"];
        }
        cell.itms = itmsLink;
        [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:icon]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error){

            if(error)
            {
                // Error Downloading image data
                cell.AppIcon.image = [UIImage imageNamed:@"placeholder.png"];
            }
            else
            {
                [cell.AppIcon setImage:[UIImage imageWithData:data]];

            }
        }];
        cell.AppIcon.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:icon]]];
        cell.number.text = [NSString stringWithFormat:@"%li", (long)indexPath.row + 1];
    }];

    cell.AppIcon.layer.masksToBounds = YES;
    cell.AppIcon.layer.cornerRadius = 16.0;
    cell.installButton.layer.masksToBounds = YES;
    cell.installButton.layer.cornerRadius = 5.0f;
    cell.installButton.layer.borderColor = [UIColor darkGrayColor].CGColor;
    cell.installButton.layer.borderWidth = 1.0f;



    return cell;
}
4

1 に答える 1

0

JSON から取得しているため、取得元のサーバーがデータを並べ替えない場合があります。もちろん、サーバーの API を明らかにしない限り、それが何をしているのかを知ることは不可能です。

さらに情報を提供せずにできることは、サーバーから新しいデータを受信した後に並べ替えを行うことです。

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name"  ascending:YES];
NSArray *sortedApplicationArray = [application sortedArrayUsingDescriptors:@[descriptor]];
application = sortedApplicationArray;

そのコードを cellForRowAtIndexPath 内に置かないでください。行が作成されるたびに並べ替えが行われるからです。

私は問題が何であるかを知っていると思います。

cellForRowAtIndexPath に非同期操作があります。セルの UI 要素は、dict オブジェクトを使用して操作キューの外で直接設定する必要があります。

非同期で実行する必要があるように見える唯一のことは、イメージのダウンロードです。そのためには、github の SDWebImage を使用することをお勧めします。SDWebImage は独自のキューでダウンロードを処理し、イメージをメモリとディスクにキャッシュします。

于 2013-10-19T21:58:24.120 に答える