【问题标题】:How to open a new window with its own ViewController from AppDelegate in Swift如何在 Swift 中从 AppDelegate 使用自己的 ViewController 打开一个新窗口
【发布时间】:2014-09-25 20:42:08
【问题描述】:

我创建了一个带有下拉菜单的状态栏应用程序。我想从该下拉列表中打开一个设置窗口。我已经用自己的 ViewController 制作了设置窗口。

问题是我不知道如何实例化和显示我所做的设置窗口。我试图跟踪互联网上的每个线程,但没有任何成功。

我的视图控制器:

class SettingsViewController: NSViewController {
   @IBOutlet var ipAddress: NSTextField!
   @IBOutlet var port: NSTextField!

   @IBAction func connect(sender: AnyObject) {}
   override func viewDidLoad() {
      super.viewDidLoad()
   }
}

我的 AppDelegate:

class AppDelegate: NSObject, NSApplicationDelegate {
   @IBOutlet var statusMenu: NSMenu!
   var statusItem: NSStatusItem?
   var tcpService: TcpService = TcpService()

   func applicationDidFinishLaunching(aNotification: NSNotification?) {

      let bar = NSStatusBar.systemStatusBar()

      statusItem = bar.statusItemWithLength(20)
      statusItem!.menu = statusMenu
      statusItem!.image = NSImage(byReferencingFile: NSBundle.mainBundle().pathForResource("16*16", ofType: "png"))
      statusItem!.highlightMode = true

      tcpService.initOutputStream("192.168.1.1", Port: 8888)
   }

   func applicationWillTerminate(aNotification: NSNotification?) {
      // Insert code here to tear down your application
   }
   @IBAction func openSettings(sender: AnyObject) {
      // open settings for ip and port optional port
   }
}

【问题讨论】:

  • 为什么不使用模式窗口?

标签: macos cocoa swift nswindow nsviewcontroller


【解决方案1】:

在 Swift 3 中:

        var myWindow: NSWindow? = nil
        let storyboard = NSStoryboard(name: "Main",bundle: nil)
        let controller: EditorViewController = storyboard.instantiateController(withIdentifier: "editorViewController") as! ViewController
        myWindow = NSWindow(contentViewController: controller)
        myWindow?.makeKeyAndOrderFront(self)
        let vc = NSWindowController(window: myWindow)
        vc.showWindow(self)

【讨论】:

  • 为什么不直接从情节提要中实例化一个窗口控制器并跳过窗口设置?
【解决方案2】:

我不是 100% 完全理解您的问题,但假设您正在使用情节提要(如果您刚开始,您应该这样做),在 applicationDidFinishLaunching 方法中添加几行将有所帮助:

        var myWindow: NSWindow? = nil
        let storyboard = NSStoryboard(name: "Main",bundle: nil)
        let controller: SettingsViewController = storyboard?.instantiateControllerWithIdentifier("SettingsViewController") as SettingsViewController
        myWindow = controller.window
        myWindow?.makeKeyAndOrderFront(self)

不要忘记在 IB 中设置 Storyboard ID(在上面的示例中为 SettingsViewController)!

【讨论】:

  • 我认为这段代码行不通。 SettingsViewController 没有名为“窗口”的成员。请问有什么建议吗?
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多