如何将文本字段绑定到包含一行的一个核心数据实体的属性?

发布于 2024-12-03 11:27:22 字数 298 浏览 2 评论 0原文

我有一个视图想要显示我的应用程序的汇总使用数据。足够方便的是,我有一个可可核心数据实体,其中所有使用数据都已预先聚合(因此它只有一行)。我想将实体中的每个单独属性绑定到不同的 NSTextFields (例如不在 NSTableView 中)。

这似乎不是核心数据+界面构建器可以很好处理的使用模式。到目前为止,我正在做的是将聚合属性复制到 NSUserDefaults 中,并将我的文本字段绑定到默认值。我想要一种更好、更优雅的方式来做到这一点。

还有更好的想法吗?需要用一条又大又粗的线索敲我的头吗?

一如既往地感谢您的阅读...

I have a view that wants to show summarized usage data for my app. Conveniently enough I have a cocoa core data entity with all the usage data pre-aggregated (so it has only one row ever). I would like to bind each individual attribute in the entity to different NSTextFields (eg not in an NSTableView).

This does not seem to be a usage pattern that core data + interface builder handles nicely. So far what I am doing is duplicating my aggregated attributes into NSUserDefaults and binding my text fields to the defaults. I would like an better, elegant way to do this.

Any better ideas out there? Do I need to be smacked in the head with a big fat clue?

Thanks as always for reading...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心奴独伤 2024-12-10 11:27:22

好吧,我只是用我自己的大线索撞到了自己的头。
解决方案是使用 NSObjectController。

  1. 将 NSObjectController 实例作为 IBOutlet 添加到 NSWindowController 实现中。
  2. 将 NSObjectController 添加到对话框的 xib 并将字段绑定到它。
  3. 将视图/窗口控制器(文件所有者)中的 NSObjectController 链接到 xib 中的 NSObjectController。
  4. 实现控制器的windowDidLoad。

在我的例子中,它在标题中看起来像这样:

NSObjectController *dataCtrl;
...
@property (nonatomic, retain) IBOutlet NSObjectController *dataCtrl;

在实现中也像这样

    @synthesize dataCtrl;
    ...
    - (void)windowDidLoad
    {
        NSManagedObject *totals = [StatsSupport getTotalRecord];
        [[self dataCtrl] setContent:totals];   // where the rubber meets the road
        [super windowDidLoad];
    }

当然 +[StatsSupport getTotalRecord] 是你的基本核心数据获取类型代码,如果你读到这里你就知道它是什么样的。 (它可能已经存在,因为您需要此代码或类似的代码来执行正常的数据读取/更新)

最后跳一点快乐的舞蹈,因为您让可可为您做了一些工作。

Ok I just hit my own head with my own big fat clue.
The solution was to use NSObjectController.

  1. Add instance of NSObjectController to the NSWindowController implementation as an IBOutlet.
  2. Add the NSObjectController to the xib for the dialog and bind the fields to it.
  3. Link the NSObjectController in your view/window controller (File's Owner) to the NSObjectController in the xib.
  4. Implement the controller's windowDidLoad.

In my case it looks like this in the header:

NSObjectController *dataCtrl;
...
@property (nonatomic, retain) IBOutlet NSObjectController *dataCtrl;

And like this in the implementation

    @synthesize dataCtrl;
    ...
    - (void)windowDidLoad
    {
        NSManagedObject *totals = [StatsSupport getTotalRecord];
        [[self dataCtrl] setContent:totals];   // where the rubber meets the road
        [super windowDidLoad];
    }

And of course +[StatsSupport getTotalRecord] is your basic core data fetch type code which if you read this far you know how that looks. (and it will probably already exist since you need this code or something similar just to perform normal data reading/updating)

Lastly do a little happy dance because you made cocoa do some work for you.

心房的律动 2024-12-10 11:27:22
-(void)updateFields {
  // fetch the row from the persistent store into your custom object
  // then get a reference to the data in your object, e.g.
  MyDataObject *data = [resultsArray objectAtIndex:0];

  myTextField1.text = [NSString stringWithFormat:@"%d", [data.anIntegerValue intValue]];
  myTextField2.text = data.aTextValue; 
  // etc...
}
-(void)updateFields {
  // fetch the row from the persistent store into your custom object
  // then get a reference to the data in your object, e.g.
  MyDataObject *data = [resultsArray objectAtIndex:0];

  myTextField1.text = [NSString stringWithFormat:@"%d", [data.anIntegerValue intValue]];
  myTextField2.text = data.aTextValue; 
  // etc...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文