【问题标题】:Best Practice for Manipulating UI Elements In Cocoa在 Cocoa 中操作 UI 元素的最佳实践
【发布时间】:2012-02-24 14:44:56
【问题描述】:

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

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

基本上,我有一个开始按钮、一个取消按钮和一个下一步按钮。应用程序的初始状态将是启用开始按钮、取消和禁用下一步按钮。算法的状态应该随着它的进展在所有按钮上交换启用/禁用。

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

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

【问题讨论】:

    标签: cocoa user-interface xcode4.2


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢罗伯。我只是完全错过了 Interface Builder 中的绑定选项卡。我很惊讶我找不到办法,但它就在我面前。
    【解决方案2】:

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

    即您的ViewController 对象将从ProgramController 调用doSomething 方法;并且当它结束时ProgramController 将从其委托中调用somethingDidFinish 方法,如您的ProgramControllerDelegate 协议中所定义)

    【讨论】:

    • 我正在阅读有关 delgate 概念的更多信息。谢谢你指点我。乍一看,这听起来有点像我在 .NET 中习惯的视图模型范例。本质上,我需要比我拥有的控制器类多一个。听起来对吗?我正在扩展一个遗留应用程序,它可能将太多层混合到一个控制器对象中,我盲目地遵循了这个例子。
    • 我不确定您的特殊需求,但是对于上面的示例,两个类就足够了,一个用于视图,一个用于控制器,其中视图实现了控制器的委托协议,因此控制器可以“通知”视图进度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多