【问题标题】:Updating Bound NSTextField When Child Object Changes子对象更改时更新绑定的 NSTextField
【发布时间】:2011-03-14 20:06:45
【问题描述】:

当绑定到的对象的子对象发生更改时,我在更新它的可见属性时遇到了 NSTextField(或可能是任何 NSControl)的问题。

我认为代码会简化对问题的理解(对于这个例子进行了简化):

// Team object contains a team leader of object type MyPerson

@interface MyTeam : NSObject {

   MyPerson * teamLeader;
   NSString * teamName;
}

@property (readwrite, retain) MyPerson * teamLeader;
@property (readwrite, copy) NSString * teamName;

-(NSString *)teamLeaderFirstName;
-(NSString *)teamLeaderLastName;

// In the implementation file return the first name and last name
// of the teamLeader

@implementation MyTeam

@synthesize teamLeader
@synthesize teamName;

-(NSString *)teamLeaderFirstName {
    return [[self teamLeader] teamLeaderFirstName;
}

-(NSString *)teamLeaderLastName {
    return [[self teamLeader] teamLeaderLastName;
}

绑定是:

NSArrayController --> MyTeam 对象的 NSArray NSTableView --> NSArrayController NSTextField --> NSArrayController --> 选定项 --> 团队名称 NSTextField --> NSArrayController --> 选择的项目 --> Lead First Name NSTextField --> NSArrayController --> 选择项 --> Lead Last Name

当我在表格中选择一个团队时,会向网络服务器发出一个调用以获取团队信息,并且子对象(包括团队负责人)会得到适当更新。但是,在我选择另一个团队然后返回到第一个选择的团队之前,UI 中不会更新团队负责人的名字和姓氏。

我知道发生了什么,绑定的文本字段没有收到有关 MyPerson 对象更改的通知。我不知道如何使 MyPerson 对象 KVC/KVO 符合此目的。

我尝试过强制使用 willChangeValueForKey 和 didChangeValueForKey。尽管这对我不起作用,但我认为这是错误的做法。

我尝试直接绑定到对象而不是使用中间方法(teamLeadFirstName getter),但这也不起作用。我知道数据正在从服务器调用的模型中填充,因为我可以在调试器中确认它。所以我认为我的问题只是 KVO 部分。

目标仅为 10.6,因此不涉及遗留问题。

非常感谢任何有关如何解决此问题的帮助或建议。

【问题讨论】:

    标签: objective-c cocoa cocoa-bindings key-value-observing


    【解决方案1】:

    我犯了一个愚蠢的错误。我正在绑定到子对象中不符合 KVO 的类方法。

    愚蠢,愚蠢的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多