当前位置: 首页 > 知识库问答 >
问题:

无法在Swift中加载情节提要中的UIViewController XIB文件

毛淳
2023-03-14

我读过使用XCode故事板来实例化使用XIB进行设计的视图控制器,但我在Swift(使用XCode 6 Beta 6)中遇到了困难。我想知道是我做错了什么,还是这个功能不再可用了?

我创建了一个简单的存储库https://github.com/jer-k/storyboardtesting-swift,它展示了上述方法。

我通过添加并重写到init来解决这个问题

required init(coder aDecoder: NSCoder) {
    super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle())
}

但我想知道是否仍有可能让故事板为我处理这件事。用上面的代码创建一个继承所有UIViewControllers的超类并不是世界上最麻烦的事情,但我只是好奇这一点。

共有1个答案

秦才良
2023-03-14

发生的是Seed5打破了视图控制器可以通过名称查找其xib的机制,如果视图控制器是一个Swift类。原因在于类的名称,在Swift的心目中,与您给它起的名字(以及您给xib文件起的名字)不一样;名称已经被“破坏”了,特别是在模块名称之前(即,Swift类具有名称空间)。

我提供三种解决办法:

>

  • 您的解决方法是一个很好的方法(显式地按名称加载.xib文件)

    将.xib文件命名为mymodule.testviewcontroller.xib,其中mymodule是您的包的名称(即项目的名称)(这是苹果的建议,但我讨厌它)

    在视图控制器的声明之前使用@objc(TestViewController)来克服名称混乱,这是破坏机制的原因(这是我喜欢的方法)

    参见我在这里的讨论:https://stackoverflow.com/A/25163757/341994和我在那里的进一步讨论:https://stackoverflow.com/A/25152545/341994

    编辑此错误在iOS 9测试版4中修复。如果nib文件搜索失败,IOS9现在会从视图控制器类名中删除模块名,并第二次执行nib文件搜索。

  •  类似资料:
    • 问题内容: 我已经阅读了使用XCode故事板来实例化使用XIB进行设计的视图控制器,但是在Swift中使用XCode进行工作时遇到了麻烦(使用Xcode 6 Beta 6)。我想知道我做错了什么还是该功能不再可用? 我创建了一个简单的存储库https://github.com/jer-k/StoryboardTesting- Swift ,展示了上述方法。 我设法通过在init中添加和覆盖来解决此

    • 问题内容: 我有两个不同的故事板: 主板:SWrevealViewController(应用程序的主要部分) Loginstoryboard:登录/注册控制器 当用户未登录或注销时,应使用Loginstoryboard。然后应该对Mainstoryboard进行设置。 如何迅速实施? 期待您的回答! 一月 问题答案: 您是否尝试切换您在 假设您有: 要在登录后切换视图控制器,您可以执行以下操作:

    • 问题内容: 我是PostgresSQL的新手,我正尝试加载以下格式的数据: 记录超过1万,某些列可能包含NULL数据。当我尝试这样做时: 我收到以下错误:ERROR:最后一个预期的列SQL状态之后的多余数据:22P04 我已经检查了列,它们还可以。这意味着不会遗漏任何列。 希望有人能帮忙。提前谢谢。 问题答案: 应该是 对我有用

    • 问题内容: 我在Xcode 6中创建插座集合时遇到麻烦。Xcode6中的插座集合现在可以用作常规IBOutlets,并且您使用相同的@IBOutlet属性来声明插座集合,同时确保为该类型指定一个数组。我已经在我的视图控制器的快速文件中做到了这一点,即 在Xcode 5中,当一个控件使用助手编辑器从情节提要中的元素拖到情节提要中时,将为它们提供一个用于创建出口或出口集合的选项。这似乎在Xcode 6

    • 问题内容: 我正在重建没有情节提要的应用程序,而我遇到最大麻烦的部分是以编程方式浏览视图到视图。很少有东西不用情节提要写出来,因此很难找到答案。 我的问题很简单。我有我和我,我想从前者推向后者。 在: 然后在: 打印返回零。我试着做: 当创建类时(但在ViewDidLoad外部,在类声明的正下方),并使用var 完成了推送,但这没有用。 我在想,也许解决方案是在App Delegate中创建整个应

    • 问题内容: 我在位于Xcode中两个不同.storyboard文件内的两个不同UIViewControllers之间传递数据。(这是一个很大的项目,因此我不得不将其分解为不同的故事板。) 我已经在要向其传递数据的视图中建立了一个“ exercisePassed”变量(字符串),而且我已经知道如何在位于不同情节提要中的两个视图之间移动。像这样 如何不使用Segue / PrepareForSegue