Ios 当一个UIImageView';s图像是从Interface Builder设置的,如何加载该图像?

Ios 当一个UIImageView';s图像是从Interface Builder设置的,如何加载该图像?,ios,cocoa-touch,uiimageview,interface-builder,nsbundle,Ios,Cocoa Touch,Uiimageview,Interface Builder,Nsbundle,当从属性检查器预先设置图像视图的源时,何时/如何解析文件的实际路径?似乎没有人打电话给NSBundle,但我可能错了 编辑:我正在尝试swizzle调用任何方法(如果可能的话),以便稍后动态地替换资产 iOS将自动在与xib文件相同的捆绑包中查找您的文件overflow.png。如果您的xib文件正好位于应用程序的目标中,则默认情况下,它位于主捆绑包中 如果要以编程方式将新图像加载到图像视图中,并且图像位于主捆绑包中,请执行以下操作: UIImage *image = [UIImage imag

当从属性检查器预先设置图像视图的源时,何时/如何解析文件的实际路径?似乎没有人打电话给NSBundle,但我可能错了

编辑:我正在尝试swizzle调用任何方法(如果可能的话),以便稍后动态地替换资产


iOS将自动在与xib文件相同的捆绑包中查找您的文件
overflow.png
。如果您的xib文件正好位于应用程序的目标中,则默认情况下,它位于主捆绑包中

如果要以编程方式将新图像加载到图像视图中,并且图像位于主捆绑包中,请执行以下操作:

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"];
self.imageView.image = image;
如果您的图像位于另一个包中:

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
self.imageView.image = image;

UIImage
初始化者或工厂都没有接到呼叫。
我用调试器(在iOS模拟器7.0.3上)做了一些研究,发现如下:
1) 在IB中设置的
UIImageView
通过
-initWithCoder:
初始化
2) 在
initWithCoder:
method
decodeObjectForKey:
中调用。名为
UIImage
的(!)键包含来自IB的图像。此图像通过ivar设置为
UIImageView
,而不是通过
setImage:
setter。
所以,IB似乎在编译时将原始图像数据打包到XIB/故事板中。胡说八道,但却是真的。
这就是为什么我们不能swizzle
+imageNamed:
或其他工厂,而应该使用条件代码为retina4和iOS6设置图像

编辑:

注释显示编译的IB文件的hextump中有png名称

事实上,看看“hextump-C”的输出 BYZ-38-t0r-view-8bC-Xf-vdC.nib”表示 PNG将显示在编译文件中。因此,它必须加载文件数据 通过同一捆绑包中的文件名


但是,它们仍然是通过一些内部机制加载的,而不是通过
imageNamed:

加载的,难道它不只是相对于视图控制器所在的包吗?可能它调用[UIImage imageNamed:]?我不是一个暴躁的忍者,所以我不知道你怎么能克服它。很好的猜测,但它似乎没有使用那种方法。你找到解决办法了吗?未调用
pathForResource
imageNamed
中的任何一个。。。此外,
UIImage
上的
initWithContentsOfFile:
没有被调用,没有发现是的,但是有没有调用任何方法来获取路径?(请参见我的动机编辑)。@kasrak,你想要图像溢出的路径吗?它在主包里吗?我想我不是很清楚。我想知道当运行库从脚本/xib加载UIImageView时,它实际上是如何初始化UIImageView的。这将允许自动替换应用程序中的图像,而无需任何代码更改。@andi有输入错误。尝试self.imageView.imageYes…所以没有办法关闭像imageNamed这样的方法?您可以关闭它,但对于这个特定任务,您将无法获得任何好处有关“IB将原始图像数据打包到XIB”的评论没有意义。我只是查看了一个已编译的故事板,发现图像数据没有内联到输出文件BYZ-38-t0r-view-8bC-Xf-vdC.nib中。事实上,查看“hextump-C BYZ-38-t0r-view-8bC-Xf-vdC.nib”的输出表明PNG的文件名出现在编译文件中。所以,它必须通过文件名从同一个包加载文件数据。@MoDJ谢谢你的评论,我已经适当地更新了答案。不过,我想请你更仔细地对待你的措辞。“这没有意义”是辱骂而不是建设性的。辱骂?Petro,你在你的文章中断言内联PNG数据是“胡说八道,但却是真实的”。我纠正你错误的结论不是滥用,而是苏格拉底式的方法。