【问题标题】:Binding an NSTableView to an NSMutableArray将 NSTableView 绑定到 NSMutableArray
【发布时间】:2010-02-22 09:10:34
【问题描述】:

我正在学习 Cocoa,但遇到了一个问题:我想通过绑定将 NSMutableArray 的内容绑定到 NSTableView。我阅读了很多关于它们的文档,但我无法让它们工作(我的表格中没有显示任何内容)。

以下是事实:

我创建了一个名为MTMTask 的简单模型,其中包含两个属性prioritytext

MTMTask.h

@interface MTMTask : NSObject {
 NSString *priority;
 NSString *text;
}

@property(copy) NSString* priority;
@property(copy) NSString* text;

- (id) initWithPriority :(NSString*)newPriority andText:(NSString*)newText;

@end

MTMTask.m

#import "MTMTask.h"

@implementation MTMTask

@synthesize text, priority;

- (id) initWithPriority:(NSString *)newPriority andText:(NSString *)newText {
 if (self = [super init]) {
  priority = newPriority;
  text = newText;
  return self;
 }
 return nil;
}

@end

然后我创建了 MTMTaskController :

MTMTaskController.h

#import <Cocoa/Cocoa.h>
#import "MTMTask.h"

@interface MTMTaskController : NSObject {
 NSMutableArray *_tasksList;
}

- (NSMutableArray *) tasksList; 

@end

MTMTaskController.m

#import "MTMTaskController.h"

@implementation MTMTaskController

- (void) awakeFromNib
{ 
 MTMTask *task1 = [[MTMTask alloc] initWithPriority:@"high" andText:@"Feed the hungry cat"];
 MTMTask *task2 = [[MTMTask alloc] initWithPriority:@"low" andText:@"Visit my family"];

 _tasksList = [[NSMutableArray alloc] initWithObjects:task1, task2, nil];
}

- (NSMutableArray*) tasksList
{
 return _tasksList;
}

@end

最后我编辑了 MainMenu.xib:我添加了一个 NSObject 并将其类设置为 MTMTaskController。然后我添加了一个名为TasksListController 的NSArrayController,它的内容出口绑定到MTMTaskController.tasksList。我还将其模式设置为Class 和类名MTMTask。我将NSTableView 的两列的value 出口绑定到TasksListController 文本和优先级。

但是当我运行程序时,它并没有真正成功:表格中没有显示任何内容。

您对我的问题有任何想法吗?我想我错过了一些东西,但我不知道是什么。

提前致谢!

【问题讨论】:

  • 您是否设置了断点以确保控制器和对象实际上正在被创建?您可能忘记将控制器作为对象添加到 xib 文件中,在这种情况下,awakeFromNib 将不会被调用。
  • 刚试过:我在awakeFromNib里放了一个NSLog()调用,在控制台中显示出来了。看起来问题不存在。

标签: cocoa nsarray cocoa-bindings


【解决方案1】:

当您从 nib 为处于清醒状态的控制器分配对象时,您会创建对象,将它们添加到数组中,然后将该数组设置为任务列表。

关于绑定的事情是你需要知道 KVO(键值观察),这是绑定对象知道它们绑定的东西已经改变的机制。

在从 nib 唤醒方法中,您只是直接设置了不调用 KVO 的数组。

我创建了一个示例 Xcode 项目 (Xcode 3.1),您可以 download from here。这会为任务列表创建一个属性,并在 awakeFromNib 方法中使用属性语法分配数组,它会为您处理 KVO:

- (void)awakeFromNib {
    Task *task1 = [[Task alloc] initWithPriority:@"high" andText:@"Feed the cat"];
    Task *task2 = [[Task alloc] initWithPriority:@"low" andText:@"Visit my familiy"];

    self.taskArray = [[NSMutableArray alloc] initWithObjects:task1, task2, nil];

}

或者,您可以将作业夹在willChangeValueForKey:didChangeValueForKey: 消息中,但我将把它作为练习留给您。

【讨论】:

  • 效果很好!非常感谢你!我想已经理解你的解释了。我需要更频繁地使用@property。
  • 感谢您的解释!我今天遇到了完全相同的问题。
  • 你的解释也帮助了我。谢谢你让我头疼不已!
猜你喜欢
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多