2017-02-07 4 views
5

В настоящее время я пытаюсь восстановить существующий проект чисто программным способом (без файлов раскадровки и файлов nib). Я знаю, что в нем уже есть какие-то посты, но они мне не помогли. Это способ решить:OSX Cocoa Swift: программирование ViewController программно (без файлов раскадровки или nib)

main.swift

import Cocoa 

let delegate = AppDelegate() 
NS Application.shared().delegate = delegate 

let ret = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)` 

AppDelegate.swift

import Cocoa 

class AppDelegate: NSObject, NSApplicationDelegate { 

    let viewController = ViewController() 
    let window = NSWindow(contentRect: NSMakeRect(0, 0, NSScreen.main()!.frame.size.width, NSScreen.main()!.frame.size.height), styleMask: [.titled, .closable, .miniaturizable, .resizable], backing: NSBackingStoreType.buffered, defer: false) 

    func applicationDidFinishLaunching(_ aNotification: Notification) { 
     viewController.view = NSView(NSMakeRect(0, 0, window.frame.size.width, window.frame.size.height)) 
     viewController.view.wantsLayer = true 
     window.contentView!.addSubview(viewController.view) 
     window.makeKeyAndOrderFront(nil) 
    } 

} 

ViewController.swift

import Cocoa 

class ViewController: NSViewController { 

    override func viewDidAppear() { 
     let button = NSButton(frame: NSRect(x: 150, y: 200, width: 300, height: 30)) 
     button.action = #selector(ViewController.buttonPressed(_:)) 
     button.target = self 
     view.addSubview(button) 
    } 

    func buttonPressed(_: Any?) { 
     print("OK") 
    } 

} 

Позже, план должен переключаться с эти кнопки между различными диспетчерами просмотра и показывают разные представления. Правильно ли это, или есть «лучший» способ сделать это? Моя цель - иметь одно окно и различные ViewControllers. Благодарим за помощь.

ответ

2

Вам также необходимо установить target на кнопку. action сообщает, какой метод вызывать, но без цели ему нечего называть методом.

Вам также может потребоваться изменить способ действия, чтобы разрешить параметр sender: func buttonPressed(_: Any?) {...} и установить действие на #selector(ViewController.buttonPressed(_:)).

Я также заметил, что контроллер вашего вида удерживается только в локальной переменной в applicationDidFinishLaunching. Он должен быть свойством AppDelegate, так что есть ссылка на него, иначе он будет удален сразу.

+0

похоже, что это не проблема. – manu

+0

Попробуйте добавить параметр к вашему методу действий. Выделите отредактированный ответ. – Uncommon

+0

Когда я нажимаю кнопку, он создает ошибку в «let ret = NSApplicationMain (CommandLine.argc, CommandLine.unsafeArgv)» в файле main.swift. Я предполагаю, что может быть что-то не так с вызовом контроллера представления, но i не знаю точно, что .. – manu

Смежные вопросы