swift - 如何以编程方式将根视图控制器添加到 macOS?
问题描述
我想弄清楚如何在 macOS 上设置根视图控制器。这有点令人困惑,我也遇到了一些错误。我确实遵循了一些 iOS 指南并尝试查看有关 Mac 指南的其他一些帖子。但我正在处理这些错误。在 Info.plist 中,我的主故事板文件也设置为“Main”,我应该删除它吗?我是 macOS 方面的新手。
我正在使用 AppKit 而不是 Apple 最新的 SwiftUI 库。所以这是我正在处理的事情。我非常感谢任何提供帮助的人!:)
这是我的 AppDelegate 文件。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow?
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
let storyBoard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
let homeViewController = storyBoard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("ViewController")) as! ViewController
NSApp.keyWindow?.contentViewController = homeViewController
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
这是我得到的错误:
2020-11-06 01:24:11.985119-0800 avengers[53735:1621559] Failed to set (contentViewController) user defined inspected property on (NSWindow): Unable to activate constraint with anchors <NSLayoutXAxisAnchor:0x600002a0f940 "NSTextView:0x7fecb041f8b0.centerX"> and <NSLayoutXAxisAnchor:0x600002a0c040 "NSView:0x7fecb0609d80.centerX"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.
2020-11-06 01:24:12.028071-0800 avengers[53735:1621559] Storyboard (<NSStoryboard:0x600003d08320 path='/Users/jazilzaim/Library/Developer/Xcode/DerivedData/avengers-gixxxwjnvqcwkreksxccdalagqme/Build/Products/Debug/avengers.app/Contents/Resources/Base.lproj/Main.storyboardc', initialController='NSWindowController-B8D-0N-5wS'>) doesn't contain a controller with identifier 'ViewController'
这是我的视图控制器。
import Cocoa
class ViewController: NSViewController {
let labelTxt: NSText = {
let text = NSText()
text.string = "Hello"
text.translatesAutoresizingMaskIntoConstraints = false
return text
}()
override func viewDidLoad() {
super.viewDidLoad()
labelTxt.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
labelTxt.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
labelTxt.topAnchor.constraint(equalTo: view.topAnchor, constant: 150).isActive = true
self.view.addSubview(labelTxt)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
解决方案
您以编程方式创建 vc 所以替换
let storyBoard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
let homeViewController = storyBoard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("ViewController")) as! ViewController
和
let homeViewController = ViewController()
此外,您应该在进行约束之前添加子视图
self.view.addSubview(labelTxt)
labelTxt.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
labelTxt.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
labelTxt.topAnchor.constraint(equalTo: view.topAnchor, constant: 150).isActive = true
推荐阅读
- awk - 如何使用 gawk 5 以确定的方式将字符串转换为 int 等价物?
- python - parse(text) - AttributeError: 'str' object has no attribute 'unknown'
- java - Springboot中SOAP请求/响应的拦截器
- python - 根据另一行中的值将新列分配给DataFrame
- r - mean() 函数可以显示累积分布函数的概率吗?
- python - 对多个图像系列的子图进行动画处理
- bluetooth - Android Wear:使用蓝牙在手机上通过 GSM 进行网络连接
- vb.net - VB.NET 如何在visual studio中制作滑入/滑出申请表(程序)?
- php - 一个 foreach 中的两个变量
- c# - 为什么我的字符串右侧没有填充?