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

在Cocoa中操作UI元素的最佳实践,cocoa,user-interface,xcode4.2,Cocoa,User Interface,Xcode4.2,首先,我要说的是,我对可可的开发还不熟悉。我也很惊讶我还没有找到一篇关于这个的帖子,但是我已经过滤了很多帖子,但都没有成功 我有一组元素,它们应该根据长时间运行的算法的状态改变状态 基本上,我有一个开始按钮、一个取消按钮和一个下一个按钮。应用程序的初始状态为“启动”按钮启用、取消和“下一步”按钮禁用。算法的状态应在所有按钮上进行交换启用/禁用 我看到的每个操纵按钮状态的选项都涉及到将button.enabled编码到控制器代码中。我来自ASP.NETMVC的背景,在我深入研究Cocoa的过程中,

首先,我要说的是,我对可可的开发还不熟悉。我也很惊讶我还没有找到一篇关于这个的帖子,但是我已经过滤了很多帖子,但都没有成功

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

基本上,我有一个开始按钮、一个取消按钮和一个下一个按钮。应用程序的初始状态为“启动”按钮启用、取消和“下一步”按钮禁用。算法的状态应在所有按钮上进行交换启用/禁用

我看到的每个操纵按钮状态的选项都涉及到将button.enabled编码到控制器代码中。我来自ASP.NETMVC的背景,在我深入研究Cocoa的过程中,这在我看来是倒退了。在MVC模式中,视图逻辑不应该与控制器逻辑分离吗


对我来说,我似乎应该能够在算法运行和算法成功时发出几个布尔值,并在视图层绑定按钮状态。我需要放弃这个想法吗?或者我可能遗漏了Cocoa版本的设计模式(比如我绑定视图的对象应该是一个视图模型,它与控制器类交互)?或者,最后,是否有一个简单的方法来完成我所说的,而我只是错过了它

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


i、 e您的
ViewController
对象将从
ProgramController
调用
doSomething
方法;当其结束时,
ProgramController
将从其代理调用
somethingDidFinish
方法,如
ProgramControllerDelegate
协议中所定义)

您不需要将按钮的启用状态编码到控制器中。您可以在控制器上声明一个
BOOL
属性,例如
isBusy
,然后在开始长时间操作时将此属性设置为
YES
,在完成长时间操作时将其设置为
NO
。您必须使用兼容的方法来实现这一点,这本质上意味着使用setter,因此您需要调用
self.isBusy=YES

这样做的原因是,您可以使用设置UI控件上的绑定。进入其中一个按钮的绑定检查器,并使用键路径
isBusy
已启用的
绑定绑定到控制器对象


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

我正在进一步了解delgate概念。谢谢你指给我看。乍一看,它听起来有点像我在.NET中习惯的视图模型范例。本质上,我需要一个以上的控制器类。听起来对吗?我正在扩展一个遗留应用程序,它可能将太多的层混合到一个控制器对象中,我盲目地遵循了这个示例。我不确定您的特殊需要,但对于上面的示例,两个类就足够了,一个用于视图,一个用于控制器,其中视图实现了控制器的委托协议,因此控制器可以“通知”视图进度。谢谢Rob。我完全错过了Interface Builder中的绑定选项卡。我很惊讶,我找不到一个方法来做这件事,但它就在我面前。