iOS Today Extension中的SDWebImage

时间:2015-04-04 09:46:35

标签: ios objective-c uiimageview sdwebimage

我正在编写一个iOS Today Extension,里面有一些UIImageView个。我想从其中的网址设置图片,所以我认为使用SDWebImage是最好的。我写了下面的代码:

#import "TodayViewController.h"
#import <NotificationCenter/NotificationCenter.h>
#import "UIImageView+WebCache.h"
#import "SDImageCache.h"
#import "UIImageView+WebCache.m"
#import "SDImageCache.m"

@interface TodayViewController () <NCWidgetProviding>

@property (strong, nonatomic) UIImageView *firstImage;

@property (strong, nonatomic) UILabel *titleLabel;

@property (strong, nonatomic) NSDictionary *dataOne;

@end

@implementation TodayViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [self updateData];

    self.preferredContentSize = CGSizeMake(self.view.frame.size.width, 230);

    NSInteger quarterSize = self.view.frame.size.width/4;
    NSInteger eightSize = quarterSize/4;

    self.firstImage = [[UIImageView alloc] initWithFrame:CGRectMake(eightSize, 45, quarterSize, quarterSize*1.25)];
    [self.firstImage sd_setImageWithURL:[NSURL URLWithString:@"http://anluan.com/crest2.jpg"]];
    [self.view addSubview:self.firstImage];

    self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(eightSize, self.firstArticle.frame.origin.y + self.firstArticle.frame.size.height + 10, quarterSize, 20)];
    self.titleLabel.text = [self.dataOne objectForKey:@"title"];
    self.titleLabel.numberOfLines = 2;
    self.titleLabel.textColor = [UIColor whiteColor];
    self.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:13];
    [self.titleLabel sizeToFit];
    [self.view addSubview:self.titleLabel];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(userDefaultsDidChange:)
                                                 name:NSUserDefaultsDidChangeNotification
                                               object:nil];
    }
    return self;
}

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
    return UIEdgeInsetsZero;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    // Perform any setup necessary in order to update the view.

    // If an error is encountered, use NCUpdateResultFailed
    // If there's no update required, use NCUpdateResultNoData
    // If there's an update, use NCUpdateResultNewData

    completionHandler(NCUpdateResultNewData);
}

- (void)userDefaultsDidChange:(NSNotification *)notification {
    [self updateNumberLabelText];
}

- (void)updateNumberLabelText {
    NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.TodayExtensionDefaults"];
    self.dataOne = [defaults objectForKey:@"dataOne"];
    }
}

@end

但是,这会一直崩溃,抛出此错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImageView sd_setImageWithURL:]: unrecognized selector sent to instance 0x7a88cc30'

1 个答案:

答案 0 :(得分:0)

首先,删除以下内容:

#import "UIImageView+WebCache.m"
#import "SDImageCache.m"

您永远不必导入实现行,只需导入标题。在OOP的一般原则中,您应该隐藏其他类的实现,即称为封装。

其次,导入#import <SDWebImage/UIImageView+WebCache.h>

该文件声明了您的setImageWithUrl方法。

干杯。