在Cocoa中操作UI元素的最佳实践

时间:2012-02-01 21:58:52

标签: cocoa user-interface xcode4.2

我首先要说的是我对可可开发的新手。我也很惊讶我没有找到关于此的帖子,但我现在已经过滤了一些帖子但没有成功。

我有一组元素应该根据长时间运行算法的状态改变状态。

基本上,我有一个开始按钮,一个取消按钮和一个下一个按钮。应用程序的初始状态是启用启动按钮,取消和禁用下一个按钮。算法的状态应在所有按钮上随时启用/禁用。

我操作按钮状态的每个选项都涉及编码button.enabled到控制器代码。当我潜入Cocoa时,我来自ASP .NET MVC背景,这似乎是向后退的。视图逻辑不应该与MVC模式中的控制器逻辑分开吗?

对我来说,似乎我应该能够像算法运行和算法成功一样发出一些布尔值作为IBOutlets,并在视图层绑定按钮状态。我需要抛弃这个想法吗?或者我可能错过了一些关于设计模式的Cocoa版本的东西(比如我将视图绑定到的对象应该是一个视图模型,它与控制器类交互)?或者,最后,是否有一种简单的方法来完成我正在谈论的内容,而我却错过了它。

2 个答案:

答案 0 :(得分:1)

您无需将按钮的启用状态编码到控制器中。您可以做的是在控制器上声明BOOL属性,例如isBusy,然后在开始长时间操作时将此属性设置为YES,并在完成后NO设置属性。您必须使用符合Key-Value Coding的方法执行此操作,这实际上意味着使用setter,因此您可以调用self.isBusy = YES;

执行此操作的原因是您可以使用Cocoa Bindings在UI控件上设置绑定。进入其中一个按钮的绑定检查器,并使用Enabled的关键路径将isBusy绑定绑定到控制器对象。

Cocoa绑定使用Key-Value Observing(KVO)来监视观察到的属性的值。当isBusy属性发生更改时,绑定到它的按钮会注意到并更改其enabled状态作为响应。

答案 1 :(得分:0)

您可能缺少Objective-C的委托模型。在您给出的示例中,您可以让控制器对象运行算法并将其状态更新为其委托,在本例中为视图。

即您的ViewController对象将从doSomething调用ProgramController方法;当超过ProgramController时,somethingDidFinish方法将从其委托中调用ProgramControllerDelegate方法,如{{1}}协议中所定义的那样