【问题标题】:Cocoa Bindings: Enable a button if multiple textfields have valuesCocoa Bindings:如果多个文本字段具有值,则启用按钮
【发布时间】:2011-11-27 22:50:51
【问题描述】:

我有 5 个按钮和 5 个文本字段。我想设置绑定,以便仅当文本字段 2-5 具有值时才启用按钮 1.....仅当文本字段 1 和 3-5 具有值等时才启用按钮 2。

我刚刚开始学习可可绑定。我希望我可以使用它们来管理按钮的启用/禁用。当我尝试在其中一个按钮上设置启用绑定时,它不会让我引用文本字段。

这可能(并且正确)与绑定有关吗?

【问题讨论】:

    标签: objective-c xcode macos cocoa cocoa-bindings


    【解决方案1】:

    您将无法直接在 bitton 的绑定中引用文本字段。

    解决此问题的一种方法是创建一个 NSObject 子类 - 称之为 ButtonController - 并为 5 个文本字段设置实例变量:

    @inteface ButtonController : NSObject
    {
        NSString *text1;
        NSString *text2;
        NSString *text3;
        ...
    }
    
    @property(nonatomic, retain) NSString *text1;
    @property(nonatomic, retain) NSString *text2;
    ...
    

    在 xib 文件中,为 ButtonController 实例化一个对象。现在您可以将事物绑定到按钮控制器实例。

    接下来,将所有文本字段绑定到相应的 NSString 属性。

    然后您可以将按钮的启用属性绑定到 ButtonController 的属性。当您绑定 button1 的启用属性时,将其绑定到 text2 并选中 valuetransformer 框并选择“NSIsNotNil”。一旦你这样做了,第二个 enabled2 绑定变得可用,你可以将它绑定到 text3 等。

    我认为这会起作用,但还没有尝试过。

    【讨论】:

    • 如果您只为 64 位构建,则可以省略显式 ivars,因为您可以在实现中合成它们(以及访问器)。
    【解决方案2】:

    绑定不是有条件的,或者至少在这方面是不透明的。您必须在代码中执行此操作。检查您的文本字段文本更改回调并相应地启用按钮。应该只是几行代码。

    【讨论】:

    • 有一个enabled 绑定,还有一个值转换器可以用来绑定属性是否为nil
    • 没错,但这是一种相当复杂的方法。在处理程序中,逻辑会产生更具可读性的代码,你不觉得吗?
    • 这会导致更多的代码。启用的绑定堆栈:您可以将启用绑定到一个属性,将启用2 绑定到另一个属性等,所有这些都在 IB 中。如 Cocoa Bindings Reference 中所述,enabled 属性的最终值是所有绑定值中的AND
    • @PeterHosey,当我尝试设置与文本字段的绑定时,尽管绑定检查器抱怨它无法引用它们。我正在尝试将它们绑定到文件的 Owner.self.textfieldA(例如),文件的所有者是我的 WindowController,它有一个名为 textfieldA 的属性。知道为什么 Xcode 在绑定时不允许我引用它吗?
    • @KennyWyland:不。最简单的方法是创建一个对象控制器,将其内容绑定到 FO,并将字段绑定到对象控制器的content.textFieldA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多