Binding NSTableView与故事板中的NSArrayController绑定

Binding NSTableView与故事板中的NSArrayController绑定,binding,storyboard,nstableview,nsarraycontroller,Binding,Storyboard,Nstableview,Nsarraycontroller,我有一个小的OSX测试项目,使用Objective-C编写,使用XCode 6.2的故事板,其目标是测试NSArray与基于视图的NSTableView的绑定。虽然这个地区已经在网上被打死了,但出于某种原因,我无法使我的装订工作 我定义了一个简单的对象TESTPerson,它已从NSObject中分为以下子类: // TESTPerson.h // TBLViewBindingTest #import <Foundation/Foundation.h> @interface

我有一个小的OSX测试项目,使用Objective-C编写,使用XCode 6.2的故事板,其目标是测试NSArray与基于视图的NSTableView的绑定。虽然这个地区已经在网上被打死了,但出于某种原因,我无法使我的装订工作

我定义了一个简单的对象TESTPerson,它已从NSObject中分为以下子类:

//  TESTPerson.h
//  TBLViewBindingTest

#import <Foundation/Foundation.h>

@interface TESTPerson : NSObject

@property (nonatomic,strong) NSString *strFirstName;
@property (nonatomic,strong) NSString *strLastName;

@end
我在情节提要提供的视图中放置了一个NSTableView,然后在视图控制器场景中放置了一个NSArrayController。

我在ViewController.h中为NSTableView和NSArrayController实例创建并连接IBOutlet。NSArray*arrayNames也已声明,并将由NSArrayController用作内容源

//  ViewController.h
//  TBLViewBindingTest

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

@interface ViewController : NSViewController

@property (strong) IBOutlet NSTableView *myTableView;
@property (nonatomic,strong) NSArray *arrayNames;
@property (strong) IBOutlet NSArrayController *myArrayController;

@end 

我在情节提要中选择了ArrayController,并将属性选项卡中的类名设置为“TESTPerson”,并将绑定选项卡设置为使用arrayNames的模型键路径将ArrayController与我的ViewController绑定。我期望arrayNames将填充在ViewController viewDidLoad方法中创建的两个TESTPerson实例

然后,我在故事板中选择了表视图,并使用arrangedObjects的控制器键将其表内容设置为绑定到数组控制器


深入到TableView层次结构中,我为每列选择了表视图单元格节点,并分别使用objectValue.strFirstName和objectValue.strLastName的模型键路径将值绑定到表单元格视图

我的理解是,这是在tableview中显示数组中的数据所需的全部内容。但是,当我执行该程序时,不会显示任何表行。我通过NSLog添加了一个按钮/方法来转储ArrayController内容:

NSLog(@"%@",[_myArrayController content]);
向我显示_myArrayController没有任何内容:

`2015-03-22 13:48:49.379 TBLViewBindingTest[48776:4766635] (
)`
我仔细检查了View Controller场景中的NSArrayController是否绑定到IBOutlet\u myArrayController(它是)

然后,我在viewDidLoad中添加了一行代码,以查看是否可以将某些内容强制加载到_myArrayController中:

[_myArrayController addObjects:_arrayNames];
NSLog(@"%@",[_myArrayController content]);
2015-03-22 13:50:28.240 TBLViewBindingTest[48807:4768827] (
    "<TESTPerson: 0x610000024ec0>",
    "<TESTPerson: 0x610000024ee0>",
    "<TESTPerson: 0x610000024ec0>",
    "<TESTPerson: 0x610000024ee0>"
)
在屏幕上显示填充的tableView,并在_myArrayController中显示对象:

[_myArrayController addObjects:_arrayNames];
NSLog(@"%@",[_myArrayController content]);
2015-03-22 13:50:28.240 TBLViewBindingTest[48807:4768827] (
    "<TESTPerson: 0x610000024ec0>",
    "<TESTPerson: 0x610000024ee0>",
    "<TESTPerson: 0x610000024ec0>",
    "<TESTPerson: 0x610000024ee0>"
)
2015-03-22 13:50:28.240 TBLViewBindingTest[48807:4768827](
"",
"",
"",
""
)
在我看来,ArrayController实例和_arrayNames之间的绑定似乎不被接受。我尝试了很多方法-在ArrayController属性选项卡中将TESTPerson属性作为键添加,但没有效果。使用NSObject作为TESTPerson的基础应该足以使TESTPerson类KVC兼容(?),但我想知道ArrayController是否不同意


据我所知,基本数据显示所需的一切都在那里。我错过了什么?

问题是在-viewDidLoad中设置_arrayNames的内容对于NSArrayController和targetViewController的控制器内容之间的绑定执行来说太晚了。(-VIEWWILLISE也太晚了)

怎么办?要解决此问题示例代码中的问题,可以为viewcontroller创建一个新的指定初始值设定项,并在其中设置数组内容

不过,OSX10.10中的Segues是另一种动物。序列中调用的NSViewController的指定初始值设定项似乎是-initWithCoder。如果您重写-initWithCoder并从重写中调用[super initWithCoder:],您将在目标viewController中看到self.representedObject==nil

//  ViewController.h
//  TBLViewBindingTest

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

@interface ViewController : NSViewController

@property (strong) IBOutlet NSTableView *myTableView;
@property (nonatomic,strong) NSArray *arrayNames;
@property (strong) IBOutlet NSArrayController *myArrayController;

@end 
通常,我会将NSDictionary作为代表对象传递

所以。在任何-viewWill***方法中填充已定义为viewController上的属性的源数组,用于绑定NSArrayController和viewController的控制器内容(绑定到myViewController,模型键路径==self.myArray),为时已晚

segue中目标viewController的指定初始值设定项中self.representedObject为nil,这意味着您不能在那里填充self.myArray

对于kicks,我直接在segue中的self.representedObject中为目标viewController传递了一个NSArray。然后,我调整了NSArrayController和targetViewController之间的控制器内容绑定,使模型密钥路径为self.representedObject。如果您这样做,绑定工作