1

これが私が使用しているコードです。これはシミュレーターでは問題なく機能することを覚えておいてください。ただし、iPadデバイスでテストするときに同じコードを実行すると、画像が読み込まれません。なぜこれができるのでしょうか?

SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/folder/Photos/thumbnails/IMG_1780.JPG"];
UIImage *cachedImage = [manager imageWithURL:url];

if (cachedImage)
{
    // Use the cached image immediatly
}
else
{
    // Start an async download
    [manager downloadWithURL:url delegate:self];
}


UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
[button setImage:cachedImage forState:UIControlStateNormal];
[button addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:button];
return cell;

助けていただければ幸いです!ありがとうございました!

編集:変更されたコードは、Simでも機能しますが、デバイスでは機能しません。

    - (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image
{
    // Do something with the downloaded image
    //testImage = image;
    testButton = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
    [testButton setImage:image forState:UIControlStateNormal];
    [testButton addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];

}
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/album/Photos/thumbnails/IMG_1780.JPG"];
    UIImage *cachedImage = [manager imageWithURL:url];
    [self webImageManager:manager didFinishWithImage:cachedImage];
    if (cachedImage)
    {
        // Use the cached image immediatly
        //[self webImageManager:manager didFinishWithImage:cachedImage];
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
        [button setImage:cachedImage forState:UIControlStateNormal];
        [button addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:testButton];
    }
    else
    {
        // Start an async download
        [manager downloadWithURL:url delegate:self];
    }
4

4 に答える 4

4

SDWebImageManagerを使用したことはありませんが、簡単に見てみると、すべてが正しく行われているように見えます。一方、それはそうではありません...

私はかつてこれと同様の問題を抱えていましたが、髪の毛をたくさん引き裂いた後、最終的にデバイスとシミュレーターで使用されるファイリングシステムが異なることに気付きました-iPadでは大文字と小文字が区別されると思いますが、シミュレーターではそうではありません。ファイル名の大文字と小文字を再確認してください。違いが生じる可能性があります。

編集-また、キャッシュされた画像を使用しようとしていると想定していましたが(これがすぐに表示される理由です)、ダウンロードする場合は、ボタンの初期化コードが時期尚早であると思われます。

別の編集-代表者!

SDWebImageManagerのデリゲートの使用について知っていますか?おそらく、画像がダウンロードされたときに呼び出すメソッドがあります-ボタンを設定するクラスにSDWebImageManagerデリゲートプロトコルを実装する必要があります-(void)imageDidFinishDownloading:(UIImage *)myImageを含める必要があります。ここで、画像をボタンに配置する必要があります。

于 2012-04-18T07:45:31.790 に答える
0

最後の回答を編集するよりも、新しい回答を書く方が簡単です。

これが役に立つかもしれない少しのコードです-

-(void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {

    // unless you have a way to know which row it's going into, we'll just add it to the end of the array

    [downloadedImages addObject:image];

    [myTable reloadData];

}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [downloadedImages count];
}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }


    NSInteger row = indexPath.row;

    UIImage *theImage = [downloadedImages objectAtIndex:row];

    UIButton *testButton = [[[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)] autorelease];
    testButton.tag = row; // so we know which row the pressed button is in

    [testButton setImage:theImage forState:UIControlStateNormal];
    [testButton addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];

    [cell.contentView addSubview:testButton];

    return cell;

}


-(void)imageSelected:(UIButton *)pressedButton {

    NSInteger row = pressedButton.tag;

    // now you know which row was pressed...
}

ここでコードを変更します(tableView:cellForRowAtIndexPath:メソッドに入れないでください!)-

SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/folder/Photos/thumbnails/IMG_1780.JPG"];
UIImage *cachedImage = [manager imageWithURL:url];

if (cachedImage) {

    // Use the cached image immediately
    [downloadedImages addObject:cachedImage];

    [myTable reloadData];

} else {
    // Start an async download
    [manager downloadWithURL:url delegate:self];
}

明らかに、これは非常に基本的なことです。テーブルをリセットするために何かを追加するか、画像が数個以上ある場合は画像をファイルに書き込む必要があります。それが役に立てば幸い!

于 2012-04-18T12:53:58.873 に答える
0

少し当たり前すぎるかもしれませんが、iPad がインターネットに接続されているかどうかを確認しましたか?

于 2012-04-18T07:38:04.290 に答える
0

UIButton を作成しようとすると、非同期ダウンロードが完了しない場合があります。ダウンロードが完了した後、ステートメント内で最後のコードを呼び出す必要がありますif(このコードからわかる限り)。

于 2012-04-18T07:38:13.597 に答える