如果您在_image(NSLog 或调试器中)检查,它可能是nil。对于initWithContentsOfFile,您应该指定整个路径,例如:
NSString *path = [[NSBundle mainBundle] pathForResource:@"TM-1P2" ofType:@"png"];
_image = [[UIImage alloc] initWithContentsOfFile:path];
或者,您可以使用以下命令,它会自动查找捆绑包中的图像:
_image = [UIImage imageNamed:@"TM-1P2.png"];
后一种语法 imageNamed 会缓存图像(即即使您关闭视图控制器也会将其保存在内存中)。如果您必须在整个应用程序中一次又一次地使用相同的图像,那就太好了(因为它不必每次都重新加载它),但如果您只使用它一次,您可能不想使用imageNamed。正如imageNamed 文档所说:
如果您有一个只显示一次的图像文件并希望确保它不会被添加到系统的缓存中,您应该使用imageWithContentsOfFile: 创建您的图像。这将使您的一次性图像远离系统图像缓存,从而可能改善您应用的内存使用特性。
注意,这两个都假设您已成功将此图像添加到您的捆绑包中。
另一方面,如果图像位于您的 Documents 文件夹中,您可以像这样加载它:
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *path = [documentsPath stringByAppendingPathComponent:@"TM-1P2.png"];
_image = [[UIImage alloc] initWithContentsOfFile:path];
最后,请注意 iOS 设备区分大小写(通常模拟器不区分大小写),因此请确保您的大小写正确。
与您的问题无关,大括号之间的那些变量可能不应该在@implementation 中定义,而是您应该将它们放在@interface 中。例如,您可以将它们放在 .h 文件中,或者更好的是,您可以将它们放在 .m 文件中的私有类扩展名中,就在 @implementation 之前:
@interface ViewController ()
{
NSArray *_pArray;
UIImage *_image;
UIImageView *_imageView;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"TM-1P2" ofType:@"png"];
_image = [[UIImage alloc] initWithContentsOfFile:path];
_imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
[_imageView setImage:_image];
[_imageView setContentMode:UIViewContentModeScaleAspectFit];
[self.view addSubview:_imageView];
}
// ...
@end