MAC Tree 实现的方法(NSOutlineView) 2 (实现了简单的选择和动态修改不同的数据)

在MAC Tree 实现的方法(NSOutlineView) 1 的基础上增加如下

协议增加为:

<NSApplicationDelegate,
NSOutlineViewDelegate, NSOutlineViewDataSource,
NSMenuDelegate>

需要注意的事情是:控件的Delegate需要和类绑定,之前我们已经绑定了DataSource,都绑定同一个类

主要是为了实现选择功能:

// 这个函数必须让控件的数据Delegate和此类绑定(即不光控件的数据源和该类绑定,还要将控件Delegate和该类绑定,才会响应这个函数)

- (void)outlineViewSelectionDidChange:(NSNotification *)notification

{

if ([_outline_view_1
selectedRow] != -1)

{

NSString *item = [_outline_view_1
itemAtRow:[_outline_view_1
selectedRow]];

_Lable1.stringValue=item;

}

}

以下是实现代码

H文件

//  TreeGroup_DS.h
//  Created by DMD on 24/9/14.

#import <Foundation/Foundation.h>

@interface TreeGroup_DS : NSObject <NSApplicationDelegate, NSOutlineViewDelegate, NSOutlineViewDataSource, NSMenuDelegate>
{
    //For NSoutlineView Level 1 Items
    NSArray *_topLevelItems;

    //For NSoutlineView child items
    NSMutableDictionary *_childrenDictionary;

    // Control NSOutlineView
    IBOutlet NSOutlineView *_outline_view_1;

    IBOutlet NSTextField *_Lable1;
}
@end

M文件

//
//  TreeGroup_DS.m
//  Created by DMD on 24/9/14.

//1. 实现动态的方法刷新,更新Tree里面的数据(UNDONE)

#import "TreeGroup_DS.h"

@implementation TreeGroup_DS

- (id)init
{
    if ((self = [super init]))
    {
        [self tree_refresh:20 RootName:@"Teacher Liu(3)"];

    }
    return self;
}
- (void)loadView
{

}
- (IBAction)OnClick_BT_Refresh:(id)sender
{
   [self tree_refresh:3 RootName:@"Teacher Liu(3)"];
}

- (IBAction)OnClick_BT_Refresh2:(id)sender
{
    [self tree_refresh:5  RootName:@"Teacher Zhang(5)"];
}

-(void) get_tree_data:(NSInteger)tree_count RootName:(NSString*)item_name
{
    // Group Names
    _topLevelItems = [[NSArray arrayWithObjects:item_name,nil] retain];
    _childrenDictionary = [NSMutableDictionary new];

    // Child Names of group
    NSMutableArray *array = [NSMutableArray arrayWithObjects:nil];
    NSString *child_name=nil;
    for (int i=0; i<tree_count; i++)
    {
        child_name = [NSString stringWithFormat:@"Grade(%d)",i+1];
        [array addObject:child_name];
    }
    [_childrenDictionary setObject:array forKey:item_name];
    NSLog(@"dictionary:%@",_childrenDictionary);
}

-(void) tree_refresh:(NSInteger)tree_count RootName:(NSString*)item_name
{
    [self get_tree_data:tree_count RootName:item_name];

    [_outline_view_1 sizeLastColumnToFit];
    [_outline_view_1 reloadData];
    [_outline_view_1 setFloatsGroupRows:YES];
    [_outline_view_1 setRowSizeStyle:NSTableViewRowSizeStyleDefault];

    // Expand all the root items; disable the expansion animation that normally happens
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:0];
    [_outline_view_1 expandItem:nil expandChildren:YES];
    [NSAnimationContext endGrouping];
}

- (void)dealloc
{
    [_topLevelItems release];
    [_childrenDictionary release];
    [super dealloc];
}

// Must be function
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
    return [[self _childrenForItem:item] objectAtIndex:index];
}

- (NSArray *)_childrenForItem:(id)item
{
    NSArray *children;
    if (item == nil)
    {
        children = _topLevelItems;
    }
    else
    {
        children = [_childrenDictionary objectForKey:item];
    }
    return children;
}

// Must be function
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
    if ([outlineView parentForItem:item] == nil)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

// Must be function
- (NSInteger) outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
    return [[self _childrenForItem:item] count];
}

// Must be to show item name
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    id objectValue = nil;
    objectValue = item;
    return objectValue;
}

// 这个函数必须让控件的数据Delegate和此类绑定(即不光控件的数据源和该类绑定,还要将控件Delegate和该类绑定,才会响应这个函数)
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
{
    if ([_outline_view_1 selectedRow] != -1)
    {
        NSString *item = [_outline_view_1 itemAtRow:[_outline_view_1 selectedRow]];
        _Lable1.stringValue=item;
    }
}

@end

实现结果:

点Refresh1时,会显示一些数据

点Refresh2时,会显示another数据

如图:

测试成功!

以上可以满足:当操作的时候,不需要小图片,然后数据增加删除是通过全部刷新来实现完成。

2014-9-24 总结 BY DMD

时间: 2024-08-17 23:27:42

MAC Tree 实现的方法(NSOutlineView) 2 (实现了简单的选择和动态修改不同的数据)的相关文章

MAC Tree 实现的方法(NSOutlineView) 1

1.将NSOutlineView控件放在xib界面上 2.增加一个类,让这个类通过控件delegate和控件NSOutlineView绑定DataSource,这样这个表格就会显示这个类所指定的数据. 在这类里面需要在里面增加协议 <NSOutlineViewDataSource> 然后增加必须写的几个函数: #pragma mark - #pragma mark ***** Required Methods (unless bindings is used) ***** - (NSInteg

Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单总结一下成功安装方法: 1,Vmware Player 12.1.1-3770994(Virtual Box 老版本Win10上启动不了,新版本5.1不再支持Mac OS) 2,执行命令关闭Hyper-v服务重启:bcdedit /set hypervisorlaunchtype off (不然无法

虚拟集群通过ip或mac查找虚拟机名称方法

当虚拟集群比较大,上面虚拟机非常多的情况下,有时候网络上发现某ip或mac异常,需要定位是那台虚拟机. 对虚拟机开启了的情况下,一般通过虚拟机标签菜单下搜索按钮包含ip可以搜索到对应虚拟机,通过网络界面,选择交换机对应端口组,再选择端口标签,在运行时mac地址下可以搜索对应mac. 对虚拟机关闭了的情况下,就比较难定位虚拟机了,因为此时无法获取ip,只能通过mac去判断,但mac保存在vmx文件中,此时需要ssh登陆到esxi主机,通过linux命令搜索,具体命令如下: find /vmfs/v

svn服务器地址变换以后,mac下的处理方法

svn服务器地址变换之后,mac下的处理方法 svn服务器地址变换之后,mac下的处理方法 1.进入终端,进入项目所在的文件夹下: [java] view plain copy cd 项目位置/ 2.查看svn信息 [java] view plain copy svn info 3.输出结果 [java] view plain copy Path: . Working Copy Root Path: /Users/jpm/Documents/workspaces/ios/MyProject/BS

百度网盘Mac版如何分享链接?创建百度网盘 for Mac分享链接的方法

想把自己百度网盘里的数据分享给朋友,该怎么操作呢?有很多朋友使用百度网盘,可以很轻松的自己的文件上传到网盘上,并可跨终端随时随地查看和分享.下面Mac down小编就给大家介绍一下创建百度网盘 for Mac分享链接的方法,为使用mac版百度网盘的朋友,解决百度网盘Mac版如何分享链接的烦恼. https://www.macdown.com 百度网盘Mac版如何创建分享链接 我们以分享[18126未来教育考试系统]为例,详细介绍Mac版百度网盘分享链接的方法步骤. 1.我们首先创建百度网盘for

mac 声音内录方法

mac 声音内录方法 记录下 mac 下进行声音内录的方法,可以录制微信语音等,不需要又另外用手机转录,备忘. mac 内置的 quicktime player 已带有录音.录制视频的功能,但是录音只能选择麦克风等声音输入设备作为来源,不能直接录制系统的输出声音.现在已经有开发者做出了一个方案soundflower,它包含一个内核模块,把系统的声音输出转到输入,从而使得能直接录制到本来输出的声音. 安装 soundflower brew cask install soundflower 因为 m

MAC下最好用的抓包工具charles简单操作教程,charles mac入门

Charles for Ma是 mac 平台上一款非常强大的抓包神器,可以让开发者监视查看所有连接互联网的 HTTP 通信,包括请求,响应和 HTTP 头信息等等,charles mac让您的 Internet 连接调试任务更加快速和轻松!今天小编给大家带来了charles简单操作教程,算是charles mac入门吧,感兴趣的可以来看看! 1.抓浏览器网页请求 其实浏览器的请求一般用浏览器的开发者工具就可以,当然charles也可以做到,使用方法呢,也很简单 将你链接的网络,配置网页代理,注意

修改表中数据的两种方法(update改)

1.通过点击按钮来执行修改表中数据.(数据库和表的创建不在详细介绍,请自动阅读数据库和表的创建) 第一种方法:直接使用SQL来操作数据库,调用execSQL(sql)语句 public class MainActivity extends AppCompatActivity { private Button mPudateButton; private MySqliteHelper mMySqliteHelper; private SQLiteDatabase db; @Override pro

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口号 ,其实这么做太麻烦了 ,小弟在这里告诉你一个非常简单的方法。 1.在开始菜单中选择运行 然后输入cmd 进入DOS界面。显示如下: 2.在Dos窗口中输入netstat -ano|findst

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat  或者去修改tomcat的端口号 ,其实这么做太麻烦了 ,小弟在这里告诉你一个非常简单的方法. 1.在开始菜单中选择运行  然后输入cmd  进入DOS界面.显示如下: 2.在Dos窗口中输入netstat   -ano|findstr  8080(注意的 我的Tomcat 的断口号 是8080 你的断口号是多少就写多少) 输入完成后回车 会弹出下