如何在 MacOS 中正确显示 xib 文件的模态视图?

Posted

技术标签:

【中文标题】如何在 MacOS 中正确显示 xib 文件的模态视图?【英文标题】:How to show modal view from a xib file in MacOS correctly? 【发布时间】:2019-03-06 11:06:15 【问题描述】:

操作系统:MacOS 语言:Swift 4+

我想要什么

我想从我的主窗口显示一个简单的自定义模式视图。我在一个单独的 .xib 文件中创建了这个自定义模态视图,该文件属于 NSWindowController 类。

在 Xcode 中我添加了一个新文件 --> CocoaClass --> NSWindowController 的子类 --> 勾选“同时为用户界面创建 XIB 文件”

然后我添加了一个按钮并生成了一个操作处理程序,该处理程序只是在调试控制台上打印文本。这是为了测试按钮按下是否正确。

为了从我的主窗口显示模态视图,我在按下按钮时执行了以下代码:

let modal = SimpleModal(windowNibName: "SimpleModal")
        self.view.window?.beginSheet(modal.window!, completionHandler:  response in
            print("Finished device selection")
        )

这确实显示了视图,但不是作为模态视图。它只是在我的主窗口旁边显示视图,当我单击模态视图中的按钮时,模态视图也不会对鼠标单击事件做出反应。

我不知道该怎么做,所以如果你知道怎么做,请回答我。

注意:

当模态视图出现时,主窗口应该是无响应的,直到用户关闭模态视图。这就像将焦点从主窗口移动到模态视图。

我的演示项目的来源: OSXModalView

【问题讨论】:

developer.apple.com/documentation/appkit/nsapplication/… 您要显示模态窗口还是工作表? @Willeke 我不知道有什么区别。我曾经在 Objective-C 中制作了一个 MacOS 应用程序,并使用 sheet 制作了一个模态视图。顺便说一句,您可以查看我的项目以获取更多详细信息。据我了解,在 MacOS 中是模态视图,即从主窗口顶部向下滑动的东西。我认为这就是它应该在 MacOS 上工作的方式,而不是在 Windows 上弹出对话框。 模态窗口是一个类似于警报或对话框的窗口。一张纸从窗口顶部滑落。可以将视图控制器呈现为模态窗口或表单。请参阅 presentAsModalWindow(:) 和 presentAsSheet(:)。或者只是在情节提要中添加带有模态或表单segue的视图控制器。 【参考方案1】:

您必须在SimpleModal.xib 中的窗口对象的属性检查器中删除Visible At Launch 标志。否则你的代码可以工作。

【讨论】:

Thnx,这使它表现得像一个模态!还有一件事……(对不起,乔布斯),当我单击模态视图中的按钮时,它不会调用动作处理程序。所以我的模态视图没有收到点击事件(我猜也有其他 UI 事件)。如何解决? (如果一切正常,我接受你的回答) 要关闭工作表,只需发送调用其视图控制器的dismiss 方法。执行此操作的最佳位置是在按钮的操作方法中。希望对您有所帮助。 我已经这样做了,但是再一次,我的模态视图没有收到点击事件,所以我什至无法执行简单的 print() 因为根本没有调用动作处理程序.谢谢。 mschmidt,我解决了,但不记得最终的解决方案是什么,所以我把你的答案作为正确的答案:)

以上是关于如何在 MacOS 中正确显示 xib 文件的模态视图?的主要内容,如果未能解决你的问题,请参考以下文章

XIB 模态窗口 ios

如何使用 xib 文件正确实现 NSWindowController 子类

从 Xib 呈现模态视图控制器

OSX / macOS - 如何将 xib 迁移到情节提要

从 XIB 加载的 UITableView Sectionheader 有时显示不正确

尽管已正确初始化,XIB 视图仍不显示任何内容