macOS开发之数据绑定NSArrayController和NS

2021-08-26  本文已影响0人  chasitu

上一篇文章也写了数据绑定,本来想写在一起的,可是因篇幅较长NSArrayControllerNSTreeController这个类单独写一篇文章吧,数据绑定这块之前也写过一篇文章,这里就不多讲解了,我们直接实际操作

NSArrayController管理数据

  1. 创建工程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
  1. 打开MainMenu.xib,添加NSArrayController到xib导航区。window界面增加4个Label和4个NSTextField控件,添加NSTableView控件,完成设计设计如下图。

  2. ArrayControllerAttributes属性面板配置Class NameEmployee,Keys列表增加4个属性key。

  3. AppDelegate.m 接口部分定义NSArrayController类型arrayController变量,建立xib中NSArrayController对象到IBOutlet变量关联。

@property(strong) IBOutlet NSArrayController *arrayController;
  1. 定义数组变量
@property(nonatomic,strong)NSMutableArray *anArray;
  1. 代码完成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管理数据

  1. 创建Xcode新工程BindTreeObject。
  2. MainMenu.xib在window界面上拖放一个NSOutlineView控件,添加5个增删相关按钮如下图。
  3. 从控件工具箱拖放一个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个功能按钮可以正常管理增加删除节点了。


数据绑定两篇文章,结束

上一篇下一篇

猜你喜欢

热点阅读