[UIImageView _isResizable]:无法识别的选择器发送到实例SIGABRT

8

我有这段代码,试图循环播放一组简单的图片。在我的视图控制器的.h文件中只声明了一个UIImageView:

@property (strong, nonatomic) IBOutlet UIImageView *imageDisplay;

在我的.m文件的viewDidLoad方法中,添加以下内容:
NSMutableArray *imageView = [[NSMutableArray alloc] init];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim1.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim2.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim3.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim4.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim5.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim6.png"]]];
[imageView addObject:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"EyeAnim7.png"]]];

imageDisplay.animationImages = imageView;
imageDisplay.animationDuration = 0.25;
imageDisplay.animationRepeatCount = 50;
[imageDisplay startAnimating];

代码似乎在"imageDisplay.animationImages"这一行崩溃了,如果我创建UIImageView,创建它的getter和setter,并构建,那么它就没问题,直到我取消注释那一行。如果我取消注释,它会一直给我报错,直到我删除UIImageView并创建一个新的。不太确定发生了什么,请帮忙解决!

当你说它崩溃了,它会以什么特定的错误崩溃? - Will
2个回答

17

我对Objective-C非常陌生,我也遇到了这个错误,但原因不同。我只是想为任何其他也可能正在苦苦挣扎的人发布我的解决方案。

基本上,我有一个名为ImagesDetailViewController的自定义类,该类继承自UIViewController并具有图像属性。

@interface ImagesDetailViewController : UIViewController
@property (strong, nonatomic) UIImage *image;
@end

然后我将我的类与故事板上的UIImageView连接起来,就像这样:

@interface ImagesDetailViewController ()
@property (nonatomic, weak) IBOutlet UIImageView *imageView;
@end
在我的viewDidLoad方法中,我尝试像这样设置我的ImageView的图片,并且得到了上面提到的错误(我的image变量在prepareForSegue方法中被初始化)。
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.imageView setImage:self.image];
}

所以我被难住了,就像你们现在一样。这个问题与故事板有关。当我点击我的UIImageView然后导航到连接检查器时,我不知何故创建了两个引用出口(糟糕...),其中一个指向名为image的变量。因此,当程序运行[self.imageView setImage:self.image]时,self.image实际上是UIImageView的一个实例而不是UIImage。


4
Xcode的行为非常糟糕。如果你创建了一个输出口(outlet),然后改变变量名,输出口连接不会自动更新。你需要删除该连接并创建一个新的连接。 - edrian

13

animationImages数组必须只包含UIImage对象。您的数组包含UIImageView对象。

此外,您的代码存在风险——如果其中一个资源不存在,则应用程序将崩溃(尝试将nil对象添加到可变数组中)。以下代码更加安全:

#define kNumberOfImages 7


NSMutableArray *imageView = [[NSMutableArray alloc] init];

for(NSUInteger i = 1; i <= kNumberOfImages; i++) {
    UIImage *anImage = [UIImage imageNamed:[NSString stringWithFormat:@"EyeAnim%d", i]];
    if(anImage) {
        [imageView addObject:anImage];
    }
}

self.imageDisplay.animationImages = imageView;
self.imageDisplay.animationDuration = 0.25;
self.imageDisplay.animationRepeatCount = 50;
[self.imageDisplay startAnimating];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接