【问题标题】:Xcode: how to create instances of views and pass info to them?Xcode:如何创建视图实例并将信息传递给它们?
【发布时间】:2017-05-15 01:46:22
【问题描述】:

我正在尝试创建一个播放音频或视频文件的 MacOS 应用。我已经按照Apple's website here上的简单说明进行操作

但我想使用 File > Open 菜单项来调出 NSOpenPanel,并将其传递给 View Controller。

因此,据推测,Open 操作应该在 AppDelegate 中,因为 ViewController 窗口可能未打开。 然后将文件名传递给 ViewController 窗口的新实例。

对吗?如果是这样,我如何从 AppDelegate 中“调用”视图?

这是 AppDelegate:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBAction func browseFile(sender: AnyObject) {     
        let dialog = NSOpenPanel();
        if (dialog.runModal() == NSModalResponseOK) {
            let result = dialog.url // Pathname of the file

            if (result != nil) {

            // Pass the filepath to the window view thing.
        } else {
            // User clicked on "Cancel"
            return
        }
        }
    }

这是 ViewController:

class ViewController: NSViewController {
    @IBOutlet weak var playerView: AVPlayerView!  
        override func viewDidLoad() {
            super.viewDidLoad()

            // Get the URL somehow
            let player = AVPlayer(url: url)
            playerView.player = player
        }

【问题讨论】:

  • 您不会从 AppDelegate 调用 WindowController 或 ViewController。事实上,一旦应用程序启动,您就无法做到这一点。您需要通过相应的故事板创建第一响应者连接。
  • 那么我如何从只有菜单而没有窗口的情况下实例化视图?
  • @benwiggy 请为您的问题考虑一个更好的名称。你问的是一个非常具体的事情,这里没有概念。
  • 欢迎所有建议。

标签: swift xcode macos


【解决方案1】:

您的问题中有一些细节没有透露,但我相信我仍然可以提供正确的答案。

您可以从 AppDelegate 调用 NSOpenPanel,这没有错。请注意,用户可能会取消对话框以及如何处理这种情况。

考虑到视图,最好的办法是在 Storyboard 中创建连接到 ViewController(默认情况下就是这样)的 WindowController,然后使用 NSStoryBoard.instantiateController(withIdentifier:) 从代码中访问它,然后使用它的 window 属性像 window.makeKeyAndOrderFront(self) 这样的东西。如果您的代码中有 NSWindow 或 NSWindowController 类,那么您应该在代码中初始化该类并再次制作窗口键和前面。

【讨论】:

  • 谢谢。会试一试,看看我的进展如何。缺少哪些可能会提供进一步帮助的细节?
  • 我不确定您是否对 ViewController、WindowController、View 等有任何定义。如果您从头开始工作,这很好,如果它需要适合某些现有项目,那么有关它的更多信息将需要。
  • 我的问题中有一个项目链接。这是 MacOS 版本,在页面下方。它只是打开一个窗口并播放 Apple 托管的视频。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多