0

OK、私はObjective Cにかなり慣れていません。ウェブサーバーから画像のリストをダウンロードし、UIImageビューに適切な画像を表示して、次/前の写真を前後にスワイプして表示するアプリがあります。表示されます。写真の現在の命名形式は次のとおりです。

uploaded_141_admin1.png
uploaded_141_admin2.png
uploaded_141_interior1.png
uploaded_141_interior2.png
uploaded_141_exterior1.png

現在のコードは、ファイル名の中央部分に141があるビューにすべての画像をロードします(または、ユーザーが記録しているレコードはすべて... 141はこの場合は可変であり、フォーマットの例としてここに示されています)。問題は、それらがどのような順序で表示されるかについて、韻や理由がないように思われることです。ファイル名の最後の部分を使用してアルファベット順に並べ替えます(または、同じ結果が得られるため、ファイル名全体を使用することもできます)。 )。上記の例では、uiimageiewをスワイプすると、ダウンロードした写真が次の順序で表示されます。

uploaded_141_admin1.png
uploaded_141_admin2.png
uploaded_141_exterior1.png
uploaded_141_interior1.png
uploaded_141_interior2.png

検索しましたが、探しているものが見つかりません(間違った検索条件を使用している可能性があります)。これは、UIImageViewに画像をダウンロードして表示する既存のコードです。「ソート」コードはここのどこかにあると思います。

-(void)downloadPictures:(NSArray *)picPaths {
    ELog(@"Downloading pictures: %@",picPaths);
    // wait indicator
    [[WaitingView sharedInstance] setMessage:LocStr(@"Loading pictures... The more pictures there are, the longer this will take.  Please be patient.")];
    [[WaitingView sharedInstance] showIndicator:YES];
    [[WaitingView sharedInstance] displayOn:[self view]];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    //  queue download operation 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *downloadOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadOperation:) object:picPaths];
    [queue addOperation:downloadOp];
}

-(void)downloadOperation:(NSArray *)picPaths {
    NSMutableArray *allPictures = [[NSMutableArray alloc] init];
    for(NSString *path in picPaths) {
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@%@/%@/%@",SERVER_ADDRESS,SERVER_PORT,SERVER_PHOTOS,path]];
        NSData *picData = [NSData dataWithContentsOfURL:url];
        if(picData!=nil) {
            UIImage *img = [UIImage imageWithData:picData];
            if(img!=nil) {
                [allPictures addObject:img];    
            } else {
                ELog(@"Failed to convert data to image from url %@",url);
            }
        } else {
            ELog(@"Failed to download image from url %@",url);
        }
    }
    [[WaitingView sharedInstance] performSelectorOnMainThread:@selector(remove) withObject:nil waitUntilDone:NO];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    self.pictures=allPictures;
    if([self.pictures count]==0) {
        [self performSelectorOnMainThread:@selector(downloadErrorMessage) withObject:nil waitUntilDone:NO];
    } else {
        self.currentIndex=0;
        [self performSelectorOnMainThread:@selector(showPicture) withObject:nil waitUntilDone:NO];
    }
}

-(void)downloadErrorMessage {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oooops!" message:LocStr(@"Pictures download failed") delegate:nil cancelButtonTitle:LocStr(@"Close") otherButtonTitles:nil];
    [alert show];
    [alert release];    
    [self goBack];
}

-(void)showPicture {
    UIImage *image = [self.pictures objectAtIndex:self.currentIndex];
    ELog(@"Now displaying image with index %d: %@",self.currentIndex,image);
    self.picture.image=image;
    [self.picture setNeedsLayout];
}
4

1 に答える 1

1

あなたのdownloadPictures:方法ではpicPaths、ダウンロード操作を開始する前に、画像を希望する順序になるように配列を並べ替える必要があります。これを行うには、NSArrayメソッドを使用して新しい並べ替えられた配列を作成しsortedArrayUsingSelector:ます。並べ替えのセレクターとして使用caseInsensitiveCompare:すると、配列内のNSStringがアルファベット順に並べられます。

NSArray *sortedPicPaths = [picPaths sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

次に、NSInvocationOperationを初期化するときに、並べ替えられた配列をオブジェクトとして渡します。

于 2012-09-02T18:34:11.233 に答える