【问题标题】:How to bind an editable TextField to a read-only property如何将可编辑的 TextField 绑定到只读属性
【发布时间】:2011-01-13 12:12:51
【问题描述】:

有谁知道如何防止 Cocoa 绑定将值设置回绑定的属性,但仍会触发默认操作选择器?

我正在尝试将 NSTextField 绑定到我的数据对象上的只读 NSString 属性。 我的数据对象是这样的

...

@property(readonly) NSString* outCome;

-(void)otherMethodsAffectOutCome;

...

我将 NSTextField 与结果属性绑定,在默认操作处理程序中我调用了 -otherMethodAffectOutCome,我希望将/didChangeValueForKey 触发 outCome 属性的观察者并返回 NSTextField。

但它不起作用,NSTextField 会崩溃,因为它试图通过 setOutCome 方法设置更改的文本...我想我需要 NSTextField 观察属性值的变化,但不要尝试在文本更改时重新设置值, 我该怎么做?

谢谢! -乔尼

【问题讨论】:

    标签: cocoa-bindings


    【解决方案1】:

    由于您已经拥有自己的模型对象,因此有两个选项比覆盖 -setValue:forUndefinedKey: 更好。

    1. 只需将属性更改为不是readonly。由于它是一个 Objective-C 对象,它应该是retained。

    2. 如果您需要将属性作为readonly 暴露给外界,您可以单独在实现中手动定义setOutCome:;在外界看来,该属性似乎是只读的,除非有聪明人出现并直接调用-setOutCome:。 Cocoa Bindings 技术本身就是一个这样的聪明人。

      这是一个坏主意,除非您非常了解 retain 设置器应该如何工作并且您对此非常小心。此外,您必须将该属性转换为 nonatomic——这是 iOS 上的建议设置,而不是 OS X 上的建议设置。

    3. 最后,这是这三个中最好的解决方案,方法2的变体。除了“类别”之外,类还可以有“扩展”。简单地说,您应该将这些视为非真正类别:在主实现文件(在 .m 文件中)声明并在主实现文件中实现的方法的附加声明。这用于为您的类定义额外的私有接口。

      在代码中,它似乎是一个类别@interface,除了括号是空的,省略了类别名称。此外,它是一个奇怪的类别,因为它没有匹配的 @implementation

      这对您有什么用处?

      您可以将标题中的属性定义为(retain, readonly),然后在类扩展中将其重新定义为(retain)@synthesize 现在将创建 getter 和 setter 访问器。

    那么我们来看一个方法3的例子。

    #import <Foundation.h>
    
    @interface MyClass : NSObject
    {
        id _myValue;
    }
    @property (retain, readonly) id myValue;
    @end
    
    //
    #import "MyClass.h"
    
    @interface MyClass ()
    @property (retain) id myValue;
    @end
    
    @implementation MyClass
    @synthesize myValue = _myValue;
    @end
    

    现在属性实际上包含一个 setter 的事实是您的实现细节,同时您没有编写自己的 setter。如果您自己编写它可能会稍微快一些,并且您不必注意retain/release 调用和赋值操作的顺序。

    【讨论】:

      【解决方案2】:

      我最终想出了一个解决方法,方法是覆盖我的数据对象上的 setValue:forUndefinedKey: 方法。如果键名是outCome,不调用super直接返回。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        相关资源
        最近更新 更多