寻找有关如何以编程方式在NSWindow中显示文本的示例吗?

时间:2019-05-27 20:21:50

标签: nswindow nstextfield nstextview applescript-objc

我正在尝试在HUD样式半透明窗口中显示文本。我已经设置好了窗口的所有代码,但是现在已经搜寻了两天的文档,还没有想出一种可以在窗口中实际显示文本的方法。由于我在Script Debugger中使用AppleScriptObjC,而不是Xcode,因此我宁愿通过编程方式执行此操作,而不必切换到Xcode并使用IB。 (我确实花了一些时间来弄乱IB,但是说实话这不是很直观。因此,我认为在阅读有关如何开始使用IB的指南之前,我会先检查此表格)。

因此,我被建议“创建一个NSTextField并将其添加到窗口的contentView中”。因此,我尝试了许多不同的设置来尝试初始化NSTextField(和NSTextView),而且我可能已经能够使该部分正确无误,但是要使文本实际显示在窗口中比我预期的要困难得多。我已经包含了用于生成窗口的代码的代码片段。

tell (NSWindow's alloc()'s ¬
            initWithContentRect:{{theWidth, theHeight}, {640, 480}} ¬
                styleMask:NSBorderlessWindowMask ¬
                backing:NSBackingStoreBuffered ¬
                defer:true)

            setOpaque_(yes)
            setAlphaValue_(0.5)
            setBackgroundColor_(NSColor's grayColor())
            setReleasedWhenClosed_(yes)
            setExcludedFromWindowsMenu_(yes)
            orderFrontRegardless()
            delay 1
            |close|()
        end tell

我希望能够在该窗口中获得一个NSText视图,以便在其中显示一些文本。到目前为止,我还没有接近。我通常得到的错误是关于“无法识别的选择器发送到实例”。所以很明显我做错了。我希望有一个尚未实现的简便方法。

1 个答案:

答案 0 :(得分:1)

听起来有些方法没有目标。在tell语句中,通常隐含目标,但有时AppleScript无法确定目标。您也没有获得更新的方法语法,所以我希望只为所有内容指定目标-还要注意,通常可以直接设置对象属性,而不是使用其setter方法。

我无法从您的代码段中分辨出,但是您还需要将textView添加到窗口的contentView中,例如:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

# create a text view
tell (current application's NSTextView's alloc's initWithFrame:{{20, 20}, {600, 440}})
  set theTextView to it
end tell

# create a window
tell (current application's NSWindow's alloc()'s ¬
    initWithContentRect:{{200, 600}, {640, 480}} ¬
    styleMask:(current application's NSBorderlessWindowMask) ¬
    backing:(current application's NSBackingStoreBuffered) ¬
    defer:true)
  set theWindow to it
  set its opaque to true
  set its alphaValue to 0.5
  set its backgroundColor to (current application's NSColor's grayColor)
  set its releasedWhenClosed to true
  set its excludedFromWindowsMenu to true
end tell

theWindow's contentView's addSubview:theTextView
theTextView's setString:"this is a test"
theWindow's orderFrontRegardless()
delay 5
theWindow's |close|()