web-dev-qa-db-ja.com

Swiftを使用したスト​​ーリーボードまたはxibファイルのないOSXアプリケーション

残念ながら、インターネットで役立つものは見つかりませんでした-知りたいのですが、SwiftでストーリーボードやXIBファイルを使用せずにアプリケーションを初期化するために実際に入力する必要があるコードは何ですか。 mainという名前の.Swiftファイルが必要です。しかし、そこに何を書けばいいのかわかりません(autoreleasepoolなどが必要ですか?)。たとえば、NSMenuを初期化するにはどうすればよいですか。また、アクティブウィンドウにNSViewControllerを追加するにはどうすればよいですか(iOSの同様の.rootViewControllerは役に立ちません)。助けてくれてありがとう;)

編集:AppDelegateの前で@NSApplicationMainを実際に使用したくありません。そこで正確に何が起こるかを知り、それを自分でやりたいのです。

30
borchero

@NSApplicationMain属性が必要ない場合は、次のようにします。

  1. main.Swiftファイルを持っている
  2. 次のトップレベルコードを追加します。

    import Cocoa
    
    let delegate = AppDelegate() //alloc main app's delegate class
    NSApplication.sharedApplication().delegate = delegate //set as app's delegate
    
    // Old versions:
    // NSApplicationMain(C_ARGC, C_ARGV)
    NSApplicationMain(Process.argc, Process.unsafeArgv);  //start of run loop
    

残りはアプリのデリゲート内にある必要があります。例えば。:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
    var newWindow: NSWindow?
    var controller: ViewController?

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        newWindow = NSWindow(contentRect: NSMakeRect(10, 10, 300, 300), styleMask: .resizable, backing: .buffered, defer: false)

        controller = ViewController()
        let content = newWindow!.contentView! as NSView
        let view = controller!.view
        content.addSubview(view)

        newWindow!.makeKeyAndOrderFront(nil)
    }
}

それからあなたはviewControllerを持っています

import Cocoa

class ViewController : NSViewController {
    override func loadView() {
        let view = NSView(frame: NSMakeRect(0,0,100,100))
        view.wantsLayer = true
        view.layer?.borderWidth = 2
        view.layer?.borderColor = NSColor.red.cgColor
        self.view = view
    }
}
26
Daij-Djan

上記の最上位コードサンプルは、最近のバージョンのXcodeでは機能しなくなりました。代わりにこれを使用してください:

import Cocoa

let delegate = AppDelegate() //alloc main app's delegate class
NSApplication.shared().delegate = delegate //set as app's delegate

let ret = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
18
Ted Lemon

Swift 4では、わずかに変更されていますが、

メインファイルには

import Cocoa

let delegate = AppDelegate()
NSApplication.shared.delegate = delegate

NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)

AppDelegateは

import Cocoa


class AppDelegate: NSObject, NSApplicationDelegate {
    var newWindow: NSWindow?
    var controller: ViewController?

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        newWindow = NSWindow(contentRect: NSMakeRect(10, 10, 300, 300), styleMask: .resizable, backing: .buffered, defer: false)

        controller = ViewController()
        let content = newWindow!.contentView! as NSView
        let view = controller!.view
        content.addSubview(view)

        newWindow!.makeKeyAndOrderFront(nil)
    }
}

ビューコントローラは同じです

7
Noskcaj