首先,我假设这是在AppleScriptObjC,而不是旧的AppleScript Studio。
首先,您需要使 AppleScript 等效于 IBOutlet,它是引用文本字段并允许 Objective-C 代码(或 AppleScript)与之通信的实例变量(或属性)。在 AppleScript 脚本的顶部,添加如下一行:
script MDAppDelegate
property parent : class "NSObject"
property hostNameTextField : missing value -- add this line
然后,您需要按住 Control 键从 nib 文件中的脚本实例拖动到窗口中的文本字段以“连接”此插座。
[更新]:从您收到的错误消息来看,您似乎没有在 nib 文件中正确设置此 hostNameTextField 连接。
下图中显示的 nib 文件中的MDAppDelegate 蓝色立方体图标表示您的 AppleScript 脚本的一个实例,该脚本将在加载该 nib 文件时在运行时创建。您可能已经正确地建立了从按钮到蓝色 AppleScript 立方体的“连接”,它指定当您单击按钮时,它应该调用 ButtonHandlerVolumeSetting0_() 函数(又名 AppleScript 处理程序)。您现在需要选择您的蓝色 AppleScript 立方体实例,如下图所示,然后右键单击(或按住 Control 单击)并从蓝色立方体拖动到您的输入文本字段,如下所示。
当您松开鼠标按钮时,它应该会显示一个黑色弹出面板,其中包含您可以“连接”到文本字段的可能属性。选择hostNameTextField。
之后,当您选择蓝色 AppleScript 立方体时,在右侧实用工具区域的连接检查器中,您可以看到 AppleScript 脚本的连接。在Outlets 下,您将看到hostNameTextField 插座,在Received Actions 下,您将看到ButtonHandlerVolumeSetting0_()。
虽然 hostNameTextField 属性在 AppleScript 中设置为初始值 missing value(AppleScript 等效于 Objective-C 的 nil),但通过在 nib 文件中建立此连接,在运行时,值的hostNameTextField 将设置为您指定的NSTextField。这将允许脚本和归档到 nib 文件中的对象层次结构之间进行通信。
[更新结束]
NSTextField 从其超类 NSControl 继承名为 stringValue 的方法。此方法以NSString(相当于AppleScript string)的形式返回文本字段的内容。所以在按钮点击处理程序内部,你可以得到字符串值如下:
on ButtonHandlerVolumeSetting0_(sender)
set hostName to hostNameTextField's stringValue()
do shell script ("/usr/sbin/scutil --set HostName " & hostName) with administrator privileges
end ButtonHandlerVolumeSetting0_
使用do shell script 时,通常最好在脚本本身中省略任何包含sudo 的内容,而添加with administrator privileges 限定符。这对 AppleScript 意味着您需要以提升的权限运行脚本,它将处理显示标准身份验证对话框。