【问题标题】:High-Level App Design/Architecture高级应用程序设计/架构
【发布时间】:2023-03-25 02:54:01
【问题描述】:

在过去的几年里,我做了相当多的 iOS 开发工作,所以我对 iOS 架构和应用程序设计非常熟悉(一切都是 ViewController,您可以推送、弹出或粘贴到标签栏中)。我最近开始探索适当的 Mac 应用程序开发,感觉有点失落。我真的很想进行一次完整性检查,并可能就构建这样的应用程序的正确方法提供一些建议:

我想构建一个库风格的单窗口应用程序,它会在运行过程中产生额外的窗口,但不是完整的文档。主窗口的布局与 OS X Lion 的 Mail.app 非常相似,具有三宽拆分视图,其中包含:

  1. 来源列表,或高级主题选择
  2. 列表视图与第一个窗格中所选主题相关的项目
  3. 详细视图,显示中间窗格中所选对象的详细信息

就像我说的,就外观而言,它与 Mail.app 非常相似。

我的问题实际上是如何从 XCode 内部将所有这些粘合在一起。到目前为止,这是我的困惑所在:

  • 默认项目生成一个带有主菜单和窗口的 NIB。我喜欢封装功能,所以我应该为这个窗口制作一个窗口控制器并以某种方式将它连接到 Interface Builder 中,还是特定于窗口的功能属于其他地方?

  • 如果可能,我希望我的三个窗格中的每一个都是单独的视图控制器。我创建了三个 NSViewController 子类(XCode 自动生成的 NIB),并添加(到主菜单/窗口 NIB)视图控制器对象并指定每个类,将每个 view 属性连接到三个 Custom View 通用 NSView 对象之一我掉进了 NSSplitView。当我尝试设置每个视图控制器的NIB时,下拉菜单中只出现了主菜单/窗口NIB,手动键入所需的NIB似乎没有效果(运行应用程序时视图的内容实际上并没有出现) .这让我觉得我做错了什么。

  • 对于前两个窗格中的每一个应该使用什么类型的视图,我有点模糊。我显然会为最终窗格构建一个自定义窗格,但似乎前两个应该已经存在于 Cocoa 框架中。

无论如何,如果我做错了事,请不要费心解决我的问题;只是告诉我我应该做什么。我想我只需要一个合适的 Mac 开发人员来为我指明正确的方向。

【问题讨论】:

    标签: xcode macos cocoa interface-builder cocoa-design-patterns


    【解决方案1】:

    关于您的第一个问题,您不需要使用 Apple 在 MainMenu.xib 中提供的主窗口。如果您愿意,您可以从 nib 中删除该窗口,然后在您的 applicationDidFinishLaunching: 委托方法中实例化一个 NSWindowController,然后加载并控制主窗口。

    您肯定对NSViewController 感到困惑,这并不令人惊讶,因为您可能会认为它像UIViewController 一样工作。

    事实上,NSViewControllerUIViewController 完全不同,并且没有相同级别的 Interface Builder 支持。例如,您不能将视图控制器放置在 IB 的窗口中,而这是 iOS 上的标准做法。 NSViewController 在 Mac 上是一个相对较新的类,通常您使用它以编程方式加载视图并管理视图内容。

    在 Mac 上与 UIViewController 最接近的类是 NSWindowController。这比NSViewController 存在的时间要长得多,事实上许多Mac 应用根本不使用NSViewController

    通常,您应用中的每个窗口都应该有一个窗口控制器来管理它。您可以使用NSWindowController 的子类来处理每个窗口的大量功能。

    如果你想使用NSViewController,那么你应该使用你的窗口控制器来管理那些视图控制器对象。由于上述缺乏 Interface Builder 支持,这通常以编程方式完成。每个NSViewController 实例从特定的 nib 文件加载其视图。您通常不会在 Interface Builder 中添加视图控制器。

    对于您的源列表,如果您有多个部分,通常使用NSOutlineViewNSTableView。每当您需要项目列表时,都会使用这两个对象。 NSOutlineView 是分层的,而 NSTableView 是扁平的。

    我希望这会有所帮助。

    【讨论】:

    • 这是完美的,正是我想要的。你说得对;我完全认为UIViewControllerNSViewController 是同义词。可靠的答案和很好的建议。谢谢!
    猜你喜欢
    • 2011-09-30
    • 2013-12-08
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2010-10-06
    • 2014-06-20
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多