web-dev-qa-db-ja.com

画像のSDWebImageの読み込みに失敗した場合にのみ、プレースホルダー画像を設定します

ダウンロードが進行するまでimageviewの背景色を表示したいのですが、ダウンロードが失敗したり、画像が利用できない場合は、プレースホルダー画像を表示したいと思います。どうすればこれを達成できますか?

主な目的は、ロード中ではなく、後で画像を設定することです。

ありがとう

5

Swift 3の解決策:

cell.imageView?.sd_setImage(with: url) { (image, error, cache, urls) in
            if (error != nil) {
                cell.imageView.image = UIImage(named: "ico_placeholder")
            } else {
                cell.imageView.image = image
            }
}

Objective Cのソリューション:

[cell.imageView sd_setImageWithURL:url
                  placeholderImage:nil
                         completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                if (error) {
                                  self.imageView.image = [UIImage imageNamed:@"ico_placeholder"];
                                } else {
                                  self.imageView.image = image;
                                }
}];

皆さんがこれがお役に立てば幸いです。

7

SDWebImageから ドキュメント

ブロックの使用

ブロックを使用すると、画像のダウンロードの進行状況と、画像の取得が成功したかどうかを通知できます。

// Here we use the new provided sd_setImageWithURL: method to load the web image

for Swift:

cell.imageView.sd_setImageWithURL(url, placeholderImage:nil, completed: { (image, error, cacheType, url) -> Void in
            if (error) {
                // set the placeholder image here

            } else {
                // success ... use the image
            }
        })

objective-Cの場合

    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:nil
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                    if (error) {
                                      self.imageView.image = [UIImage imageNamed:@"placeHolderImage"];
                                    }
                                 }];
5
Alsh compiler

読み込み/エラー画像を分離するための拡張機能です。 LoadingImageは、SDWebImageがplaceholderImageと呼んだものになります。読み込みがうまくいかなかった場合、errorImageが実際のプレースホルダーになります。

import Foundation
import SDWebImage

extension UIImageView {
    /// Separated loader and error images, short version.
    func zap_setImage(with url: URL?, loadingImage: UIImage?, errorImage: UIImage) {
        self.zap_setImage(with: url, loadingImage: loadingImage, errorImage: errorImage, completed: nil)
    }

    /// Separated loader and error images, long version.
    func zap_setImage(with url: URL?, loadingImage: UIImage?, errorImage: UIImage, completed: SDExternalCompletionBlock?) {
        self.sd_setImage(with: url, placeholderImage: loadingImage, options: []) { [weak self] (uiimage: UIImage?, error: Error?, sdimagecachetype: SDImageCacheType, usedurl: URL?) in
            //print("ISSUE1688 uiimage: \(String(describing: uiimage)), error: \(String(describing: error))")

            let setErrorImage: Bool
            switch error {
            case .none:
                // No error?
                if uiimage == nil {
                    // No error, but no image, so use error image
                    setErrorImage = true
                }
                else {
                    setErrorImage = false
                }
                break
            case .some(_):
//          case .some(let errorvalue):
                // Error?
                //print("ISSUE1688 errorvalue: \(errorvalue)")
                setErrorImage = true
                break
            }

            //print("ISSUE1688 setErrorImage: \(setErrorImage)")
            if setErrorImage {
                self?.image = errorImage
            }

            if let c = completed {
                c(uiimage, error, sdimagecachetype, usedurl)
            }
        }
    }
}
1
Jonny

これを行うには、nilをプレースホルダー属性に渡し、完了ブロックを自分で処理します。

このような :

    [self.imageView sd_setImageWithURL:self.imageURL
                  placeholderImage:nil
                           options:nil
                          progress:nil
                         completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                             if(!error) {
                                 self.imageView.image = image;
                             } else {
                                 self.imageView.image = [UIImage imageNamed:@"placeHolder"];
                             }
                             }];

私はそれを試していません。それを試してみて、それがあなたのために働いたかどうか教えてください。

1
Haroun SMIDA

'SDWebImage'の場合、 '〜> 4.0'このimageview拡張機能を使用します

extension UIImageView {

    func setImage(imageString: String, localUri: String = "", placeHolderImage: UIImage? = nil, loader: Bool = true,  loaderType : UIActivityIndicatorView.Style = .white) {

        self.sd_setShowActivityIndicatorView(loader)
        self.sd_setIndicatorStyle(loaderType)

        if let url = URL(string: localUri), let data = try? Data(contentsOf: url), let img = UIImage(data: data) {

            self.sd_setImage(with: URL(string: imageString), placeholderImage: img, options: SDWebImageOptions(), progress: { (progress, total, url) in

            }) { (img, err, type, url) in

            }


        } else {
            self.sd_setImage(with: URL(string: imageString), placeholderImage: placeHolderImage, options: SDWebImageOptions(), progress: { (progress, total, url) in

            }) { (img, err, type, url) in

            }
        }
    }
}
0
Rajan Singh

これを使用できます。

cell.img_UserProfile.sd_setImage(with: URL.init(string: "\(BaseURL_Image)\(image)"), placeholderImage: #imageLiteral(resourceName: "Group 1131"), options: .highPriority, context: [:])
0
Hafeez Shaik