无法从视图控制器手动加载 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 Application
的Build 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?的主要内容,如果未能解决你的问题,请参考以下文章