在故事板中使用 Swift 嵌套 class 作为 UIViewController

Use Swift nested class as UIViewController in storyboard

你们知道是否可以在 Storyboard 中使用 Swift 嵌套 class 作为 UIViewController 吗?

我正在研究不同的方式来构建我的项目,其中之一是通过将相关的 classes 嵌套在相同的主要 class.

中来对它们进行分组。

让我用一个例子来解释:

假设我有一个用于显示我的应用程序设置的屏幕,它需要一个 UIViewController 和一个模型。
我可以创建 2 个 classes:SettingsControllerSettingsModel,但我想知道通过拥有一个 main class Settings 包含嵌套的 classes ControllerModel 像这样

class Settings {
   class Controller: UIViewController {
      ...
   }
   class Model {
      ...
   }
}

这样我就可以通过 Settings.ControllerSettings.Model 来使用它们,我认为这看起来很不错。

现在这在使用情节提要时效果很好。在情节提要中,当我 select 视图控制器设置自定义 class 时,如果我输入 Setting.Controller 并按回车键,该字段不会验证并被清除。

所以我的问题是你们知道我做错了什么或者这根本不可能吗?

我认为情节提要板(目前)还不支持,所以在此期间您需要使用一些变通方法。

如果您只需要语法 Settings.Controller,您可以这样做:(受 this answer 启发)

声明您的 Settings.Controller class 不是嵌套的 class,而是独立的 class SettingsController:

class SettingsController : UIViewController { ... }

然后在Settings中添加一个typealias:

class Settings {
    typelias Controller = SettingsController
    class Model { ... }
}

现在您可以在故事板中使用 SettingsController,但在代码中可以使用 Settings.Controller

当然,是在发布问题之后我找到了解决方案,所以我将其分享给后代。

所以我尝试这样做的方式有 1 个问题:

  1. 嵌套classes是使用点的引用 表示法:Settings.Controller 但 Interface Builder 没有 将其视为有效的 class 名称

解决方案很简单,给控制器一个它自己的 Objc 名称:

class Settings {
   @objc(SettingsController)
   class Controller: UIViewController {
   }
   ...
}

通过这样做,您可以为嵌套控制器指定一个 ObjC 名称,从而将其暴露给 Interface Builder。现在您可以通过填写 SettingsController.

来引用控制器