在 Swift 中以编程方式创建 NSTextField

Posted

技术标签:

【中文标题】在 Swift 中以编程方式创建 NSTextField【英文标题】:Creating NSTextFields programmatically in Swift 【发布时间】:2015-01-10 03:03:33 【问题描述】:

有什么方法可以使用 Swift 完全以编程方式创建 NSTextFields?我正在创建一个我不想连接到情节提要的 mac 应用程序,但除了制作 IBOutlet 之外,我想不出任何创建 NSTextField 的方法。顺便说一句,我是编程新手,很抱歉我缺乏技术语言。

谢谢!

编辑:

这是我目前尝试过的代码:

执行此操作时,我收到错误消息“致命错误:在展开可选值时意外发现 nil。”无论我是测试 SKView 还是 NSView,都会弹出相同的错误消息。如果我尝试将 IBOutlet 定义为“view”而不是“test”,它会告诉我无法覆盖存储的属性“view”。

import Foundation
import Cocoa
import SpriteKit

class SettingsScene: SKScene 

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var test: SKView!

    var ballSpeedText = NSTextField(frame: NSMakeRect(20,20,200,40))

    override func didMoveToView(view: SKView) 
        ballSpeedText.textColor = NSColor.redColor()
        ballSpeedText.stringValue = "Test"
        test.addSubview(ballSpeedText)
    

如果我尝试在不创建任何 IBOutlets 的情况下执行此操作,仅使用视图,我不会收到任何错误,但文本字段不会显示:

import Foundation
import Cocoa
import SpriteKit

class SettingsScene: SKScene 

    var ballSpeedText = NSTextField(frame: NSMakeRect(20,20,200,40))

    override func didMoveToView(view: SKView) 
        ballSpeedText.textColor = NSColor.redColor()
        ballSpeedText.stringValue = "Test"
        view.addSubview(ballSpeedText)
    

【问题讨论】:

你必须使用 SKLabel 和 SpriteKit 【参考方案1】:

您可以轻松完成。只需将您的视图连接到插座,然后您就可以这样做:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate 

    private var window: NSWindow?

    let textField = NSTextField(frame: .init(x: 20, y: 20, width: 200, height: 40))

    func applicationDidFinishLaunching(_ aNotification: Notification) 
        window = NSWindow(contentRect: NSScreen.main?.frame ?? .zero,
        styleMask: [.miniaturizable, .closable, .resizable, .titled],
        backing: .buffered,
        defer: false)
        window?.title = "My App"
        window?.makeKeyAndOrderFront(nil)
        
        textField.textColor = .red
        textField.stringValue = "Hello World !!!"
        window?.contentView?.addSubview(textField)
    

    func applicationWillTerminate(_ aNotification: Notification) 
        // Insert code here to tear down your application
    

main.swift 文件添加到您的项目中:

import Cocoa

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

在您的目标部署信息中,从主界面中删除 main.storyboard:

【讨论】:

我可能应该澄清一下我正在使用 SpriteKit 制作游戏。我有一个继承自 SKScene 的类,我试图在其中显示 NSTextField。由于它继承自SKScene,它已经有一个视图属性,但是当我做view.addSubview(myTextField) 时,它不起作用。当我尝试定义一个名为“view”的 IBOutlet 时,我也会遇到错误。在我的课堂上有没有办法做到这一点?谢谢! SKView 继承自 NSView。 SKScene 的 View 属性是 SKView 我相信

以上是关于在 Swift 中以编程方式创建 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式创建 SplitViewController?

在 Swift 中以编程方式创建垂直 UIScrollView

使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?

如何在 ios swift 中以编程方式创建自动布局等宽约束?

如何在 Swift 中以编程方式创建新的 UIViewController

如何在ios swift中以编程方式创建自动布局等宽度约束?