Xcode AppleScript项目中如何获取CheckBox控件勾选状态
Xcode AppleScript CheckBox状态获取问题
问题背景
- 基于Xcode 13.4.1新建AppleScript Project,添加CheckBox、Button控件,需要实现点击按钮时根据CheckBox勾选状态弹出对应提示
- 现有代码运行时,日志可正常输出CheckBox状态值,但alert弹窗始终无法触发
- 可公开查询的Xcode AppleScript控件相关参考资料较少
初始代码
property checkBox : 1 -- bound to the value of the check box & is ticked when run #START BUTTON on startButtonClick_(sender) -- if checkbox is ticked then show alert "ticked" -- if checkbox is NOT ticked then show alert "NOT ticked" end startButtonClick_
排查阶段尝试代码
property checkBox : missing value -- bound to the value of the check box #START BUTTON on startButtonClick_(sender) set checkBox to (checkBox as boolean) -- toggle if checkBox is 1 then display alert "Ticked" log checkBox end startButtonClick_
问题根因
- 控件绑定错误:
checkBox属性被绑定到了CheckBox的value属性,而非CheckBox控件本身,后续对该属性做强制类型转换时会触发类型不匹配的静默错误,代码运行到if判断前就中断,因此弹窗无法执行 - 取值方式错误:AppleScriptObjC框架中,CheckBox作为NSButton的子类,选中状态需要通过调用控件的
state()方法获取,直接对绑定属性强转取值不符合Cocoa脚本的调用规范
修复步骤
- 清除Xcode中
checkBox属性原有错误绑定,重新从属性列表向界面上的CheckBox控件拖线,将属性绑定到控件实体,不要绑定到控件的value/state等子属性 - 替换按钮点击回调中的代码,通过控件方法获取状态后再做判断
可直接运行的修复后代码
-- 绑定到界面上的CheckBox控件实体 property checkBox : missing value on startButtonClick_(sender) -- 获取选中状态:1=勾选,0=未勾选 set checkState to checkBox's state() as integer if checkState is 1 then display alert "已勾选" else display alert "未勾选" end if log checkState end startButtonClick_
补充注意事项
- 给控件做绑定拖线时,一定要确认绑定目标是控件本身,绑定到控件属性会导致无法调用控件的原生方法,出现各类无日志的静默错误
- AppleScriptObjC调用Cocoa控件属性时,统一通过对应getter方法取值(比如取状态用
state()、取标题用title()),不要直接对绑定的属性做类型强转,避免类型兼容问题 - 如果弹窗仍无法弹出,检查项目是否在前台运行,AppleScript触发UI弹窗需要进程拥有前台交互权限
内容的提问来源于stack exchange,提问作者Ian Barber
相关产品推荐
相关产品推荐

