无法从视图控制器手动加载 xib?

Posted

技术标签:

【中文标题】无法从视图控制器手动加载 xib?【英文标题】:Cannot manually load xib from a view controller? 【发布时间】:2012-09-25 23:59:17 【问题描述】:

我正在使用Blackboard SDK. 制作应用程序,如果您可以下载 SDK 并查看您是否有相同的错误,这将非常有帮助。 这是instructions 的链接,以防万一有人想关注——不要太多页面。

说明书说

“由于模块在启动器应用程序中运行,MainWindow.xib 文件是启动器的文件。因此,模块不能有自己的 MainWindow.xib 文件,因为它会产生冲突。

此外,当模块首次启动时,不会从 nib 文件中自动加载视图。因此,从 nib 加载的所有视图都必须在您的代码中手动加载,并且所有 nib 文件必须遵循相同的命名约定并包含在您的资源文件中。

最初,我尝试像这样实例化视图控制器

   testVC = [[LMU_LAL_ViewControllerTest alloc] initWithNibName:@"LMU_LAL_ViewControllerTest" bundle:nil];

但是,它导致了崩溃。我收到的错误信息是

Could not load NIB in bundle: 'NSBundle </Users/mahir/Library/Application Support/iPhone Simulator/6.0/Applications/2ABAAF9D-5141-41B2-8EFB-51C3E047AD67/testLauncher.app> (loaded)' with name 'LMU_LAL_ViewControllerTest

有人说可以通过下载早期版本的 xcode 来解决这个问题,但这还没有帮助。另外,我将方法从 initWithNibName:bundle: 更改为 init 并将其添加到视图控制器子类中

- (void)loadView

[super loadView];

UINib *nib = [UINib nibWithNibName:@"LMU_LAL_ViewControllerTest" bundle:nil];
[nib instantiateWithOwner:self options:nil];
 

我又收到了类似的错误,不过这次就行了 [nib instantiateWithOwner:self options:nil]

我做错了什么??

编辑:

这是支持团队的某个人给我的摘录。

您的模块使用的所有资源,包括任何 .xib 文件,都必须 被包含在发射器的项目中。这意味着在 您实际运行的项目来测试模块,启动器 项目中,所有资源文件都需要包含在其中 项目。测试是否是这种情况的一种简单方法是找到您的 .xib 通过查看启动器中 Xcode 的左侧栏来查看文件 项目。这将确保资源文件实际上是 被纳入项目。我已经包含了一个截图 它应该看起来像 Xcode 的启动器项目。

这是我目前拥有的

【问题讨论】:

您是否尝试过创建一个单独的 xib 并加载它? 【参考方案1】:

从您对 Erfan 解决方案的回复来看,问题似乎只是文件 LMU_LAL_ViewControllerTest.xib 不在目标的构建阶段。这意味着目标(您的程序)在构建时永远不会看到该文件,即使您可以在导航器中看到它。

向目标添加 xib 文件的另一种方法是执行以下操作:

在导航器窗格的顶部选择您的项目 在导航器右侧的下一个窗格中选择目标 打开Copy Bundle Resources:您可能不会看到此处列出的 LMU_LAL_ViewControllerTest.xib,尽管它应该是 选择+,在弹出的窗口中选择文件进行添加

如果这不起作用(可能不会,因为它相当于Erfan的解决方案),您可以尝试从项目中删除文件并将其重新添加。删除时,请确保Move to Trash。当您再次将其复制到项目中时,在出现的弹出窗口中,确保选中 Add to Targets 旁边的正确框。

如果您的构建阶段缺少此文件,您可能会发现其他文件也丢失了,并且会触发类似的错误。您可以检查所有构建阶段,尤其是其他资源文件的 Copy Bundle Resources 和 Objective-C 类的实现文件的 Compile Sources。

【讨论】:

【参考方案2】:

你可以在initWithNibName:bundle:的文档中找到解释

在其中搜索 nib 文件的包。这种方法寻找 包的特定语言项目目录中的 nib 文件 首先是资源目录。 如果nil,这个方法看起来 用于主包中的 nib 文件。

至于错误,您可能在 xib 文件名或代码中存在拼写错误。

【讨论】:

如何查看?我可以在左边看到它和所有其他文件,如果这就是你的意思 另外,我将一个项目(模块)导入另一个(启动器)。在模块代码中调用了 xib,但是在一个更大的项目中是否有一个项目与问题有关?【参考方案3】:

我下载了您链接到的 Blackboard SDK,并成功地将带有 .xib 文件的视图控制器添加到 ExampleModule 并从外部 SpringboardApplication 启动它。

您需要的核心操作是将您的.xib 文件的编译版本放入输出文件夹。我将在下面展示如何做到这一点。这是基于 CocoaPods 所做的。

    在你的模块子项目中创建一个视图控制器,如下所示。

    使用下面列出的文件内容,在您的 Springboard Application 项目中创建一个 shell 脚本,如上所示。

    将脚本标记为可执行! 否则它将无法运行。这可以从命令行完成:

    chmod +x /path/to/your/script.sh

    打开Springboard ApplicationBuild Phases 标签。添加Run Script 构建阶段,并引用如下所示的脚本。

此脚本将使用ibtool 创建您的.xib 文件的编译版本并将它们放入您编译的应用程序中,以便应用程序可以引用它们。

如果您无法控制 SpringboadApplication,您可能无法使用 XIB 文件,因为静态库只能包含已编译的目标代码,而不能包含资源或捆绑包。如果 SpringboardApplication 的所有者愿意与您合作,我在此处或 this *** question 的答案的变体可能对您有用。

这是该脚本的内容,基于 CocoaPods script(MIT 许可证):

#!/bin/sh

install_resource()

    case $1 in
        *.storyboard)
            echo "ibtool --errors --warnings --notices --output-format human-readable-text --compile $CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/`basename $1 .storyboard`.storyboardc $SRCROOT/$1 --sdk $SDKROOT"
            ibtool --errors --warnings --notices --output-format human-readable-text --compile "$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/`basename $1 .storyboard`.storyboardc" "$SRCROOT/$1" --sdk "$SDKROOT"
            ;;
        *.xib)
            echo "ibtool --errors --warnings --notices --output-format human-readable-text --compile $CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/`basename $1 .xib`.nib $SRCROOT/$1 --sdk $SDKROOT"
            ibtool --errors --warnings --notices --output-format human-readable-text --compile "$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/`basename $1 .xib`.nib" "$SRCROOT/$1" --sdk "$SDKROOT"
            ;;
        *)
            echo "cp -R $SRCROOT/$1 $CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH"
            cp -R "$SRCROOT/$1" "$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH"
            ;;
    esac

install_resource `ls ../../Modules/ExampleModule/*.xib`

请注意,必须自定义最后一行以包含需要从您的模块到应用程序的所有资源。显然,这可以使用多行来完成。

我根本没有改变 ViewController 代码——它仍然是 XCode 生成的版本。

如果您无法在 ~/Blackboard Mobile SDK/Samples/Application/SpringboardApplication 项目上完成这项工作,请告诉我,如果需要,我会提供更多详细信息。

【讨论】:

我认为我无法控制 SpringboadApplication;他们很可能会使用该模块并将其添加到自己的启动器中 所以下一个问题是他们是否会考虑采用单独的资源包,如我提到的其他 SO 链接所述。如果没有,那么您最好的选择是手动创建视图,然后动态下载您需要的任何图像。 我联系了支持团队的某个人。我将他向我解释的内容添加到问题中【参考方案4】:

选择导致错误的 NIB 文件(在您的情况下为 LMU_LAL_ViewControllerTest.xib),注意文件检查器并转到“目标成员”部分。在那里,您将看到您的项目名称,左侧有一个复选框。选中该框(标记为选中)并构建并运行您的应用程序。它以前发生在我身上,我已经以这种方式解决了这个问题。你可以试试这个,如果它对你有帮助,请告诉我。

【讨论】:

该框未选中,但不允许我更改它 应选中该框以加载 nib 文件。我认为您的目标设置有问题。请您重新检查一下您的目标设置是否正确? 有什么我应该寻找的具体内容 其实我很抱歉,我不明白为什么“目标会员”选项被禁用。我昨天已经搜索过了,但没有得到任何东西。 :-(【参考方案5】:

您没有指定捆绑包这一事实并不意味着它不会从“捆绑包”中加载,它只是意味着它将从默认的应用程序捆绑包中加载。我会确保 NibName 中的名称与 Interface Builder 中的 Xib 文件匹配。

【讨论】:

我仔细检查过,仍然没有帮助【参考方案6】:

尝试指定扩展名。尝试加载@"LMU_LAL_ViewControllerTest.xib"

【讨论】:

xib文件在主目录吗? 我不确定;我在另一个项目中有一个项目,而xib在内部项目中【参考方案7】:

请进入应用程序构建设置并在捆绑资源中检查是否添加了 .xb 文件 如果没有添加,则添加它。它会解决你的问题

【讨论】:

抱歉,我无法在应用程序构建设置中找到捆绑资源。是否可以提供更具体的说明?

以上是关于无法从视图控制器手动加载 xib?的主要内容,如果未能解决你的问题,请参考以下文章

从 xib 加载视图控制器返回错误的帧

如何从 xib 文件加载视图控制器?

从 xib 加载 iOS 不起作用

UIViewController 通过 xib 加载另一个视图控制器,尝试访问默认视图导致崩溃

xib 指定的位置在 UIView 加载时移动?

从 xib 错误加载表格视图中的单元格