我目前正在尝试以纯编程方式(没有 Storyboard和 nib 文件)重建现有项目。我知道已经有一些关于此的帖子,但它们并没有真正帮助我。这是一种解决方法:
主.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")
}
}
后来打算用这些按钮在不同的View Controller之间切换,显示不同的View。这是完全正确的方法还是有“更好”的方法来做到这一点?我的目标是拥有一个窗口和不同的 ViewController。谢谢你的帮助
最佳答案
您还需要在按钮上设置目标
。 action
告诉它要调用哪个方法,但如果没有目标,它就无法调用该方法。
您可能还需要更改操作方法以允许 sender
参数:func buttonPressed(_: Any?) {...}
并设置操作到 #selector(ViewController.buttonPressed(_:))
。
我还刚刚注意到您的 View Controller 仅保存在 applicationDidFinishLaunching
中的局部变量中。它应该是 AppDelegate
的属性,以便有对它的引用,否则它会立即被删除。
关于swift - OS X cocoa swift : Setting up a ViewController programmatically (without Storyboard or nib files),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094009/