macOS开发之数据绑定NSArrayController和NS
上一篇文章也写了数据绑定,本来想写在一起的,可是因篇幅较长
NSArrayController
和NSTreeController
这个类单独写一篇文章吧,数据绑定这块之前也写过一篇文章,这里就不多讲解了,我们直接实际操作
NSArrayController管理数据
- 创建工程
BindArrayObject
,模型类定义Employee
。
@interface Employee : NSObject
@property(nonatomic,assign)NSInteger id;
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,strong)NSString *address;
@end
-
打开
MainMenu.xib
,添加NSArrayController
到xib导航区。window界面增加4个Label
和4个NSTextField
控件,添加NSTableView
控件,完成设计设计如下图。 -
ArrayController
的Attributes
属性面板配置Class Name
为Employee
,Keys
列表增加4个属性key。
-
AppDelegate.m 接口部分定义NSArrayController类型arrayController变量,建立xib中NSArrayController对象到IBOutlet变量关联。
@property(strong) IBOutlet NSArrayController *arrayController;
- 定义数组变量
@property(nonatomic,strong)NSMutableArray *anArray;
- 代码完成arrayController到数组anArray的绑定
NSDictionary *options = @{ NSAllowsEditingMultipleValuesSelectionBindingOption:@YES };
[self.arrayController bind:@"contentArray"
toObject:self
withKeyPath:@"anArray"
options:options];
4个文本输入框依次完成绑定,Model Key Path对应Emploee中的属性字段
NSTableView中的4个NSTableColumn 依次完成绑定,Model Key Path对应Employee中的属性字段
Add,Remove Button分别绑定事件响应函数,Array Controller的add: remove:方法即可。
运行工程修改编辑4个文本框的内容,表格内容会同步更新。修改表格中单元内容也会更新到上面的对应的文本输入框,点击增加,删除都可以正常工作。
NSTreeController管理数据
- 创建Xcode新工程BindTreeObject。
- MainMenu.xib在window界面上拖放一个NSOutlineView控件,添加5个增删相关按钮如下图。
- 从控件工具箱拖放一个Tree Controller到左边xib结构导航区。
树节点模型
对于树形结构的视图,每个节点都要包括名称和子节点信息。我们可以用一个TreeNode模型来来描述节点信息。
@interface TreeNode : NSObject
@property(nonatomic,strong)NSString *nodeName;//名称
@property(nonatomic,assign)NSInteger count;//子节点个数
@property(nonatomic,assign)BOOL isLeaf;//是否叶子节点
@property(nonatomic,strong)NSArray *children;//子节点
@end
bind数据在处理过程中都是通过KVC的keyPath访问数据的,因此我们也可以等价的使用Cocoa的字典NSDictionary来直接描述节点信息。
NSDictionary *node = @{ @nodeName: @Group,
@children: @[
@{@name: @m1,},
@{@name: @m2}
]
};
其中子节点个数和是否是子节点都不需要了,count(子节点个数),isLeaf(是否子节点)的值都可以通过children 子节点数组推算出来,如果children的count为0,则子节点个数个数count为0,isLeaf为YES。
NSTreeController 配置节点模型
NSTreeController.h中几个重要的属性方法定义
@property (copy) NSString *childrenKeyPath; // key used to find the children of a model object.
@property (copy) NSString *countKeyPath; // optional for performance
@property (copy) NSString *leafKeyPath;
上面这3个属性对应于xib中NSTreeController 对象属性页面上的Key Paths里面的3个设置项:
Children,Count,Leaf。根据之前的分析 只要设置了Children就可以了。
这里我们在NSTreeController Attributes面板配置Key Paths下的Children为上面字典NSDictionary中定义的key children,并在下面 Class Name中输入NSMutableDictionary,在keys列表中增加name,children 2个key。
NSTreeController 的事件方法
NSTreeController定义实现了增加删除节点的方法
-(void)add:(id)sender; // 增加新节点
-(void)remove:(id)sender; //删除选择的节点
-(void)addChild:(id)sender; // 在当前选中的节点增加一个子节点
-(void)insert:(id)sender; // 插入一个节点在当前选中的节点之前
-(void)insertChild:(id)sender; // inserts a new first child into the children array of the first selected node
将上图中5个按钮Add,Add Child,Insert,Insert Child,Remove分别绑定到NSTreeController到上面5个方法,这样就可以管理树的节点数据了。
NSTreeController 跟NSOutlineView绑定
NSOutlineView数据源Content绑定
从xib界面上选中NSOutlineView,右侧inspector面板上切换到bindings绑定面板。从Outline View Content部分中Content勾选Bind to,下拉列表选择Tree Controller,Selection index Paths 勾选Bind to,从下拉列表选择Tree Controller。完成NSOutlineView到NSTreeController数据绑定。
NSOutlineView列单元cell数据绑定
点击NSOutlineView列上面的Table View Cell部分,实际上Table View Cell是一个NSTextField控件,将其Value绑定到Table Cell View,勾选Bind to 选择即可。Model Key Path绑定到 ObjectValue.name。 ObjectValue实际上代表的是当前节点对应的模型对象。name为其名字的key。
NSTreeController 跟NSMutableArray数据源绑定
AppDelegate.m的接口中增加treeNodes属性变量
@property(nonatomic,strong) NSMutableArray *treeNodes;
Tree Controller绑定到Delegate对象,Model Key Path为treeNodes。
AppDelegate.m实现init方法完成数据初始化。
- (id)init {
self = [super init];
if (self) {
NSMutableDictionary *mNode = [self newObject];
self.treeNodes = [NSMutableArray array];
[self.treeNodes addObject:mNode];
}
return self;
}
newObject为创建一个节点数据的方法。
- (NSMutableDictionary*)newObject {
NSMutableDictionary *node = [NSMutableDictionary dictionary];
node[@"name"]= @"Group";
NSMutableArray *children=[NSMutableArray array];;
node[@"children"]= children;
NSMutableDictionary *m1 = [NSMutableDictionary dictionary];
m1[@"name"]= @"m1";
[children addObject:m1];
NSMutableDictionary *m2 = [NSMutableDictionary dictionary];
m2[@"name"]= @"m1";
[children addObject:m2];
return node;
}
运行App看到初始的数据已经正常显示出来,点击5个功能按钮可以正常管理增加删除节点了。
数据绑定两篇文章,结束