【问题标题】:Use Swift nested class as UIViewController in storyboard在故事板中使用 Swift 嵌套类作为 UIViewController
【发布时间】:2019-11-22 07:57:06
【问题描述】:

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

我正在研究构建项目的不同方法,其中一种是通过将相关类嵌套在同一个主类中来对它们进行分组。

让我用一个例子来解释:

假设我有一个用于显示我的应用设置的屏幕,它需要一个 UIViewController 和一个模型。
我可以创建 2 个类:SettingsControllerSettingsModel,但我想知道如果有一个包含嵌套类 ControllerModel 的主类 Settings所以

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

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

现在这在使用情节提要时可以正常工作。在 Storyboard 中,当我选择一个视图控制器来设置自定义类时,如果我输入 Setting.Controller 并按 Enter,则该字段不会验证并被清除。

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

【问题讨论】:

  • 整个问题是 Cocoa/CocoaTouch 是用 Objective-C 编写的,因此不支持泛型、嵌套类、枚举等 Swift 特性。这就是 SwiftUI 如此重要的原因之一。

标签: ios swift cocoa-touch storyboard


【解决方案1】:

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

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

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

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

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

通过这样做,您可以为嵌套控制器指定一个 ObjC 名称,从而将其公开为 Interface Builder。现在您可以通过填写SettingsController来引用控制器。

【讨论】:

  • 我以前试过这个(我认为它也可以),但它在我的 Mac 上不起作用。很高兴它在你的身上发生了!
  • 这对我来说非常适用于视图,但不适用于控制器。好吧,它在构建时可以工作,但是情节提要找不到课程,所以我无法连接任何插座。有没有其他人经历过这种情况?
【解决方案2】:

我认为故事板(目前)不支持这一点,因此在此期间您需要使用一些变通方法。

如果你想要的只是语法Settings.Controller,你可以这样做:(灵感来自this answer

声明你的Settings.Controller类不是嵌套类,而是一个独立类SettingsController

class SettingsController : UIViewController { ... }

然后在Settings,添加typealias

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

现在您可以在情节提要中使用SettingsController,但在代码中使用Settings.Controller

【讨论】:

  • 感谢@Sweeper!由于您提到了 typealias,我做了一些额外的研究,并找到了一种为我的班级提供 ObjC 名称的方法,从而解决了问题!我在下面发布了我的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2012-12-16
  • 2015-06-18
  • 2023-03-05
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多