【问题标题】:SDWebImage : setImageWithURL fails when used to set image of a UITableViewCellSDWebImage : setImageWithURL 用于设置 UITableViewCell 的图像时失败
【发布时间】:2011-12-14 13:04:37
【问题描述】:

当调用 setImageWithURL 时,跟随失败,

[UIImageView setImageWithURL:placeholderImage:]:无法识别的选择器发送到实例 0x149a20 2011-12-14 18:11:38.060 [781:707] 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[UIImageView setImageWithURL:placeholderImage:]: 无法识别的选择器发送到 实例 0x149a20'

我可以确认我已正确包含 SDWebImage 项目和所需的标头,因为我可以成功使用 SDWebImageManager。

以下是我调用UIImageView分类方法setImageWithURL的代码

NSURL* url = [NSURL URLWithString:@"www.abc.com/abc.png"];
[cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"abc.png"]];    

【问题讨论】:

  • 您能否发布创建图像并调用该方法的代码,以便我们更好地了解可能发生的情况?
  • 问题已更新为请求的信息。此外,类别在 UIImageView+WebCache.h 文件中定义,我已将其包含在与上述代码相同的文件中。看起来这个类别功能对 UIImage 视图实例不可见。除了包含header还有什么需要做的吗?
  • 这很奇怪,因为您的代码看起来不错,错误实际上是指向未找到的类别。您确定您正在正确导入类别吗? #import "UIImageView+WebCache.h"
  • 是的,我正确导入了。我直接使用了源代码,没有将其称为静态库。问题就这样解决了。

标签: uitableview sdwebimage


【解决方案1】:

根据: linking objective-c categories in a static library

由于 XCode 中的链接器错误,您需要设置“其他链接器标志”来设置构建目标。如下设置标志应该可以消除这个错误。

-force_load ${BUILT_PRODUCTS_DIR}/libSDWebImage.a

【讨论】:

  • 我对如何将文件添加到项目感到困惑。我将 SDWebImage 文件夹复制到我的项目目录中(通过终端)。这包括 SDWebImage.xcodeproj 文件。然后我右键单击 Xcode 中的项目并单击“添加文件...”,它复制到文件夹和所有内容中,加上 .xcodeproj 文件,它在文件夹结构中再次扩展为相同的文件,以及 libSDWebImage.a 文件(红色的)。我想减小文件大小,有必要这样做吗? (我将该文件夹添加到我的项目的标题搜索路径中)但即使设置了其他链接器标志也会出现上述错误。 *困惑
  • 这有点过分了。只需将 SDWebImage.xcodeproj 拖到您的项目中即可。在项目目标的构建阶段设置“Target Dependencies”和“Link Binary With Libraries”。最后,添加上述标志以强制加载类别。
  • 如果您使用 ARC Compliant SDWebImage,则必须添加以下行:-force_load ${BUILT_PRODUCTS_DIR}/libSDWebImageARC.a
  • 有人在 xcode 4.5 上试过这个东西吗?我无法解决问题..
  • @user739711 是的,我刚刚为 xcode 4.5 解决了这个问题,我在“目标依赖项”中添加了 arc 框架,但我忘记将 libSDWebImage.a(带 arc 支持)添加到“将二进制文件与库链接” "
【解决方案2】:

这将解决问题:打开“构建设置”选项卡,在“链接”部分,找到“其他链接器标志”设置并添加“-ObjC”标志:

【讨论】:

  • 这对我没有帮助,我就是这样
  • 谢谢你,帮了我的忙
  • 在将“-ObjC”标志添加到“其他链接器标志”部分之前添加 ImageIO.framework 和 QuartzCore.framework。
  • 谢谢阿拉什!该问题的所有答案均无效,但您的评论有效。
【解决方案3】:

如果有人像我一样,即使按照所有正确的安装说明在此处看到所有其他答案(例如 force_load 或 load_all)后仍然存在问题,以下是我在网上搜索后了解到的:

  • 仅当您使用 iPhone 5S 或 64 位模拟器时才会出现此问题
  • 这是 libwebp 的问题

这个问题的解决办法: 仅当您的应用不需要 64 位处理器时才这样做(对于 iOS 编程来说太新了,不知道这句话是否有效)

  1. 转到构建设置 > 架构

  2. 在架构下,选择Standard architectures (armv7,armv7s)

  3. 在“仅构建活动架构”下,确保 DebugRelease 都为 Yes

我的来源:https://github.com/rs/SDWebImage/issues/494

我希望这对像我一样在尝试解决您的问题时发现此问题的人有所帮助 =)

【讨论】:

  • 尝试了此线程中的所有内容。唯一对我有用的东西。尽管如此,似乎在 64 位模拟器上运行良好。
【解决方案4】:

我最终将所有 .h 和 .m 文件插入到我的项目中,然后它运行良好。当我只包含 .a 和 .h 文件时,我得到了同样的错误。

【讨论】:

  • 我设法以同样的方式解决了这个问题。这不是解决问题的最佳方法,但需要验证 Steven 提到的 force_load 属性。
  • @chrizz 即使我也面临同样的问题。我已将所有 SDWebImage 文件包含到我的项目中,没有完成标题设置。我知道我在这里遗漏了一些东西。请指出我错在哪里。谢谢。
  • 我解决了同样的问题,将 libSDWebImage.a 添加到 Build Phases > Link Binary with Libraries
  • 从哪里添加 libSDWebImage?
  • 您需要添加所有 .m 文件。这将解决问题
【解决方案5】:

在 SDWebImage 文档中,它说您必须将“其他链接器标志”设置为 -ObjC。这对我不起作用。相反,我将其设置为 -all_load。我还必须删除 -ObjC。可以在此处找到对正在发生的事情的解释:

http://developer.apple.com/library/mac/#qa/qa1490/_index.html

它还解释了 -ObjC 失败的原因:“重要提示:对于 64 位和 iPhone OS 应用程序,有一个链接器错误会阻止 -ObjC 从仅包含类别而没有类的静态库中加载对象文件。解决方法是使用 f-all_load -force_load flags"

使用 -all_load 会增加可执行文件的大小。您可以使用 -force_load 来缓解这种情况。对于 SDWebImage 2.7.3,我通过在构建设置的“其他链接器标志”中设置以下内容来做到这一点:“-load_all $(SRCROOT)/SDWebImage.framework/SDWebImage”。链接到 libSDWebImage[ARC].a 这是一些消息来源的建议,对我不起作用。

顺便说一句,在 Xcode 4.4 中,您似乎必须缓慢双击才能正确更改构建设置。进行正常的双击会显示完全搞砸且无法正常工作的弹出窗口。

【讨论】:

    【解决方案6】:

    解决了将 libSDWebImage.a 添加到 Build Phases > Link Binary with Libraries 的相同问题。

    【讨论】:

      【解决方案7】:

      如果您阅读此处https://github.com/rs/SDWebImage 底部的文档,则会有一个下载 链接,其中包含指向download 的正确文件。按照那个例子,它工作得很好。

      我犯的错误是我下载了 github 项目并尝试使用它。

      【讨论】:

      • 但是我想添加源文件而不仅仅是参考
      【解决方案8】:

      将“ImageIO.framework”链接到我的主项目后,一切都开始为我工作了。

      【讨论】:

        【解决方案9】:

        您还可以将“其他链接器标志”设置为 -all_load。这解决了外部框架(例如文件选择器框架)需要链接到 SDWebImage 的问题。

        【讨论】:

          【解决方案10】:

          -force_load 不能解决根本问题(发生问题时) 解决这个链接问题..

          1. SDWebImage 的编辑方案,
          2. 为发布设置运行方案
          3. 运行(使用设备)
          4. libSDWebImage.a 将在 release-iphoneos 目录中生成。
          5. set target->BuildPhase->link Binarywithlibrary .. 添加这个库。
          6. 完成..

          【讨论】:

            【解决方案11】:

            确保你的编译文件有 UIIMageView+AFNetworking.m,以防你使用 AFNetworking 框架。

            【讨论】:

              【解决方案12】:

              您需要在链接的二进制文件中添加 libSDWebImage.a,还要检查其他链接器标志,它应该是 -ObjC

              【讨论】:

                【解决方案13】:

                在将 SDWebimages 文件拉入 Xcode 时检查您的选择,在添加的文件夹中标记“创建组”,并且不要标记“创建文件夹引用”。

                完全按照图片标记:

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-07-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多