我正在尝试将复选框的状态绑定到模型中的变量。我希望在模型中相应的布尔属性发生更改时,使用标准Yosemite动画更新复选框的状态(就像单击它时一样)。 NSButton中是否有任何方法可以做到这一点?我正在寻找类似button.changeStateWithAnimation(NSOnState)
的内容。
如果你不知道标准优胜美地动画"的含义,请务必查看this video。
当我尝试将按钮的值绑定到我的布尔属性时,该按钮会在模型更改但没有动画时更新。
所以我尝试以编程方式切换按钮的状态。
button.state = myStateProperty ? NSOnState : NSOffState
但这并没有触发动画。
我能让它发挥作用的唯一方法是致电NSButton&perform执行点击这样:
let currentButtonState = button.state == NSOnState
if currentButtonState != myStateProperty {
button.performClick(self)
}
但我认为这不是正确的做法。是吗?
答案 0 :(得分:2)
我尝试使用以下内容更改复选框的值:
checkbox.animator().setNextState()
复选框在选中/取消选中之间翻转就好了,但没有任何动画。
所以,我认为国家根本不是一个可动画的财产。
您的performClick()
解决方法可能是唯一可行的方法。
答案 1 :(得分:0)
如何将这样的代码添加到Bool变量声明中:
var checkBoxFlag:Bool = false
{
didSet
{
if checkBoxFlag == true {myButton.state = NSOnState}
if checkBoxFlag == false {myButton.state = NSOffState}
myButton.display()
}
}
只要checkBoxFlag的值发生变化,didSet代码就会被执行。
实际上,你可以做更多的事情。例如,如果你有一个名为resetAnimation的Bool:
var resetAnimation:Bool = false
{
willSet(newResetAnimation)
{
(“resetAnimation即将从(resetAnimation)更改为\(newResetAnimation)”) } didSet { if resetAnimation == true { println(“resetAnimation设置为(resetAnimation)”) }其他{ println(“resetAnimation设置为(resetAnimation)”) } } }
如果你的代码在其他地方写了:
resetAnimation = true
resetAnimation = false
resetAnimation = true
这会打印出来:
resetAnimation即将从false更改为true resetAnimation设置为true
resetAnimation即将从true更改为false resetAnimation设置为false
resetAnimation即将从false更改为true resetAnimation设置为true
编辑 - 测试:
所以这是测试场景。在我正在粘贴此测试的应用程序中,我有一个带有控制器的状态窗口。该窗口具有自定义进度指示器。我在状态窗口.xib文件中添加了一个无关的复选框,默认状态为on。
在状态窗口控制器中我声明了
@IBOutlet var testCheckbox:NSButton!
并将testCheckbox连接到状态窗口中的无关复选框。
然后在状态窗口控制器中我声明了一个实例变量:
var checkBoxFlag:Bool = true
{
didSet
{
if checkBoxFlag == true {testCheckbox.state = NSOnState}
if checkBoxFlag == false {testCheckbox.state = NSOffState}
testCheckbox.display()
}
}
并在状态窗口控制器功能中更新自定义进度指示器代码是(注意断点):
func updateStatusProgress(statusprogress:CGFloat)
{
println("In Update Status Before Change state = \(testCheckbox.state)");
if checkBoxFlag == true // breakpoint 1 here
{
checkBoxFlag = false
}else{
checkBoxFlag = true
}
println("In Update Status After Change state = \(testCheckbox.state)");
statusProgressIndicator.cgValue = statusprogress // Break point 2 here
statusProgressIndicator.display()
}
在第1个破发点开始第一次打印:
在更改状态前更改状态= 1并检查窗口时,选中了复选框。
在断点2处,申请表打印出来:
在更新状态更改状态= 0并检查窗口后,未选中复选框
进一步传递产生了相同的预期结果。
我在这里发布了我的代码,以防您在此代码和代码之间看到有关如何实现此代码的一些区别。