OSX application without storyboard or xib files using Swift

后端 未结 3 789

Unfortunately, I haven\'t found anything useful on the Internet - I wanted to know, what code I actually have to type for initializing an application without using storyboar

相关标签:
3条回答
  • 2020-11-30 23:03

    if you don't want to have the @NSApplicationMain attribute, do:

    1. have a file main.swift
    2. add following top-level code:

      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
      

    the rest should be inside your app delegate. e.g.:

    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)
        }
    }
    

    then you have a 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
        }
    }
    
    0 讨论(0)
  • 2020-11-30 23:03

    The top level code sample above no longer works in recent versions of Xcode. Instead use this:

    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)
    
    0 讨论(0)
  • 2020-11-30 23:21

    In Swift 4 it has changed slightly yet again,

    The main file must have

    import Cocoa
    
    let delegate = AppDelegate()
    NSApplication.shared.delegate = delegate
    
    NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
    

    The AppDelegate must be

    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)
        }
    }
    

    The view controller is the same

    0 讨论(0)
提交回复
热议问题