无法从文件创建UIImageView

Tne*_*ppa 3 cocoa-touch ios xcode4

我在项目的同一目录中有一个带复选标记的图像作为.png,名为"checkbox.png".我想用该图像作为背景创建一个UIImageView,并将其设置为一组UITableViewCells的附件视图.我目前有:

UIView * v = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:@"checkmark.png"]];
v.backgroundColor = [UIColor redColor];
cell.accessoryView = v;
[v autorelease];
Run Code Online (Sandbox Code Playgroud)

哪个不行.我可以制作另一个虚拟UIView(例如

v = [[UIView alloc] init]; 
v.backgroundColor = [UIColor redColor];
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,它在我的uitableviewcells的右侧显示一个小红框.我不确定为什么带有复选框的视图不起作用.我指定文件路径的方式有问题吗?

ben*_*ado 7

imageWithContentsOfFile:需要文件的路径.如果您只是给它一个文件名,它将在当前目录中查找该文件,但说实话,我不知道当前目录通常在iOS应用程序中是什么,或者即使有任何保证.

关键是,您需要为其提供文件的绝对路径,或者使用imageNamed:只需要名称并查看主要包的资源.

换一种说法:

UIImage *image = [UIImage imageNamed:@"checkmark"];
UIView *view = [[UIImageView alloc] initWithImage:image];
Run Code Online (Sandbox Code Playgroud)

另一个优点imageNamed:是它将缓存图像(如果您再次使用它),checkmark@2x如果您的设备具有Retina显示器,它将自动查找版本.

如果您不想要此行为,则可以直接获取路径:

NSString *imagePath = [[NSBundle mainBundle] pathForResourceNamed:@"checkmark" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
Run Code Online (Sandbox Code Playgroud)

如果它是一个大图像并且你不想缓存它(因为你不会经常使用它),这通常是一个更好的选择.