首页 > 代码库 > [Cocoa-4th] Chapter6 - NSTableView表格增删改 (详尽介绍2)

[Cocoa-4th] Chapter6 - NSTableView表格增删改 (详尽介绍2)

 [Cocoa-4th] Chapter6 - NSTableView表格增删改 (详尽介绍2)

功能如上:NSTableView表格增删改 

STEP1

Open XCode Ver4.6 

New Application 

在xib控件界面上加入一些控件,如图:


STEP2

新建类:NSObject子类,命名为:

Table_DS_Main

注意:添加协议NSTableViewDataSource,然后停止,从控件面板找到Object,放在界面窗口左边,指定这个类,然后

点击控件上的按钮,按住CTRL拉动到这个类代码里,会出现一个名字输入框,可以设置属性在h里面,在m里面可以设置函数。

并且设定表格数据源是Object连接器

如图



设置一些重要的信息




代码如何分开?


H文件

//
//  Table_DS_Main.h
//  test_tableview_2
//
//  Created by QXS_LIULILI on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//
/*
 Function : 此文件一个窗口界面的类,最重要有表格的几个基本函数和表格变量
 */
#import <Foundation/Foundation.h>
//以下要增加表格协议
// 因为这个类是一个表格的数据源,就是指支持表格的增加+删除和修改操作。
// 表格控件和其他控件不同,必须支持这个协议,必须有几个必须的函数,表格才能装载数据。
// 点击协议<NSTableViewDataSource>,可看到Required Methods的两个函数,必须重载编写。
// 然后还看到有Optional Methods 里面支持编辑和排序功能。
@interface Table_DS_Main : NSObject <NSTableViewDataSource>
// 以下控件通过左边显示窗口界面,点控件,然后按住CTRL,然后拖到左边代码框这里。
//(点击上面Editor的中间图表,就可以让XCODE中间显示窗口,右边显示代码)
// 在显示本类前,需要在控件面板Object Library里面找到Object控件,拖到窗口界面右边,然后指定其类为本类。
// 这样才能左边窗口右边本类函数,否则无法显示本类代码。
// 窗口上的编辑框控件NSTextField类型
@property (assign) IBOutlet NSTextField *m_edit1;
@property (assign) IBOutlet NSTextField *m_edit2;
@property (assign) IBOutlet NSTextField *m_edit3;
// 窗口上的编辑框控件NSTableView类型,
// 这里有一个技巧,第一次选中为全部表格,然后再选,就是表格(这是我们要拖过来的控件),如果再选,就是某一列。
@property (assign) IBOutlet NSTableView *m_table;

//这个多行集合,是用来装载表格里面多行多列数据的容器,可以将整个表格的数据都可以装入
//在装载的时候,every line is 自定义的行集合属性,例如:Table_DS_Main_Row_Items
@property (retain) NSMutableArray *table_rows;

-(void)full_data_to_tableview;

@end


M文件

//
//  Table_DS_Main.m
//  test_tableview_2
//
//  Created by QXS_LIULILI on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//
/*
 Function : 此文件一个窗口界面的类,最重要有表格的几个基本函数和表格变量
 */
#import "Table_DS_Main.h"

#import "Table_DS_Main_Row_Items.h"

@implementation Table_DS_Main

@synthesize m_edit1;
@synthesize m_edit2;
@synthesize m_edit3;
@synthesize table_rows;
@synthesize m_table;

// 这是本类Object的虚函数,这里重构,主要目的是为了初始化表个容器,如果不这样做,表格容器无法工作
- (id)init
{
    self = [super init];
    if (self)
    {
        //初始化列直
        table_rows = [[NSMutableArray alloc] init];
        // init
        [self full_data_to_tableview];
    }
    return self;
}
// 这个函数通过点控件,CTRL拉过来的
- (IBAction)OnBT_Add:(id)sender
{
    //首先再增加到容器前,先生成一行数据
    Table_DS_Main_Row_Items *row_items = [[Table_DS_Main_Row_Items alloc]init];
    
    row_items.col_item1 = m_edit1.stringValue;
    row_items.col_item2 = m_edit2.stringValue;
    row_items.col_item3 = m_edit3.stringValue;
    //将这一行数据装入到容器里面,这个容器已经通过表格协议里面的2个函数,将数据再次装入到表格中
    [table_rows addObject:row_items];
    [m_table reloadData];//表格装载
    [m_table scrollRowToVisible:[table_rows count]-1];//显示装载后,最后一行数据
    
}
- (IBAction)OnBT_Del:(id)sender
{
    // 获得当前选中表格的行数
    NSInteger row_index = [m_table selectedRow];
    if(row_index<=-1)
    {
        return;
    }
    //删除选中的这行记录
    [table_rows removeObjectAtIndex:row_index];
    //刷新以下表格
    [m_table reloadData];
    
}
- (IBAction)OnBT_DelAll:(id)sender
{
    //删除表格中所有的数据
    [table_rows removeAllObjects];
    //刷新以下表格
    [m_table reloadData];
}
- (IBAction)OnBT_Edit:(id)sender
{
    // 获得当前选中表格的行数
    NSInteger row_index = [m_table selectedRow];
    if(row_index<=-1)
    {
        return;
    }
    //首先编辑前,先生成一行数据
    Table_DS_Main_Row_Items *row_items = [[Table_DS_Main_Row_Items alloc]init];
    row_items.col_item1 = m_edit1.stringValue;
    row_items.col_item2 = m_edit2.stringValue;
    row_items.col_item3 = m_edit3.stringValue;
    
    //用上面生成的记录,替换当前选中行数据
    [table_rows replaceObjectAtIndex:row_index withObject:row_items];
    //刷新以下表格
    [m_table reloadData];
    [m_table scrollRowToVisible:[table_rows count]-1];

}

-(void)full_data_to_tableview
{
    int i=0;
    int count_value=0;
    NSString *text ;
    for (i=0; i<6; i++)
    {
        
        Table_DS_Main_Row_Items *newEmployee = [[Table_DS_Main_Row_Items alloc] init];        
        count_value=count_value+2;
        text=[NSString stringWithFormat:@"columne%d",count_value];
        newEmployee.col_item1 = text;
        
        count_value=count_value+2;
        text=[NSString stringWithFormat:@"columne%d",count_value];
        newEmployee.col_item2 = text;
        
        count_value=count_value+2;
        text=[NSString stringWithFormat:@"columne%d",count_value];
        newEmployee.col_item3 = text;
        
        [table_rows addObject:newEmployee];
        [m_table reloadData];
        [m_table scrollRowToVisible:[table_rows count] - 1];
    }
}

- (IBAction)OnBT_FullData:(id)sender
{
    //调用填充数据到表格里面的函数
    [self full_data_to_tableview];
}

// 选中TableView控件的某一行,然后获得里面的数据,放入到编辑框
// 以下函数,是通过选中TableView控件,然后Ctrl拖拉过来的。但是不能在这里更改函数名称。
- (IBAction)OnTableView1_Selected:(id)sender
{
    NSInteger row = [m_table selectedRow];
	if (row == -1)
    {
		return;
    }
    Table_DS_Main_Row_Items *row_item = [table_rows objectAtIndex:row];
    m_edit1.stringValue = [row_item valueForKey:@"col_item1"];
    m_edit2.stringValue = [row_item valueForKey:@"col_item2"];
    m_edit3.stringValue = [row_item valueForKey:@"col_item3"];    
}

#pragma mark [NSTableView] +++
#pragma mark ***** Required Methods (unless bindings are used) *****
// 表格控件,必须的函数,获得当前数据行数
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    return [table_rows count];
}

/* This method is required for the "Cell Based" TableView, and is optional for the "View Based" TableView. If implemented in the latter case, the value will be set to the view at a given row/column if the view responds to -setObjectValue: (such as NSControl and NSTableCellView).
 */
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    // 将容器里面的每行记录,分别放入到表格的没列里面,当表格重载的时候,就会自动执行本函数
    Table_DS_Main_Row_Items *row_items = [table_rows objectAtIndex:row];
    return [row_items valueForKey:[tableColumn identifier]];
}

#pragma mark ***** Optional Methods *****

/* NOTE: This method is not called for the View Based TableView.
 */
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    // 将容器里面的每行记录,分别放入到表格的没列里面,当表格编辑的时候,就会自动执行本函数
    Table_DS_Main_Row_Items *row_items = [table_rows objectAtIndex:row];
    [row_items setValue:object forKey:[tableColumn identifier]];
}
#pragma mark [NSTableView] ---
@end


STEP3

新建类:NSObject子类,命名为:

Table_DS_Main_Row_Items

H文件

//
//  Table_DS_Main_Row_Items.h
//  test_tableview_2
//
//  Created by EDU on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//
/*
 Function : 此文件是表格的一行:表示有三个字符串列
 */

#import <Foundation/Foundation.h>

@interface Table_DS_Main_Row_Items : NSObject

// 以下是表格每行中的列,表示有三列,当绑定连接器后,需要给表格每一列的属性里面设定其Identity是下面的名称。
// 例如,当你点了表格的第一列,可以设定属性Identity=col_item1
// Identity在点表格列后,属性里面第三个图表,会提示Show the Identity inspector,
// 然后手动输入下面名称。一定要拷贝过去,以免手动输入错误,因为这里没有下拉列表选择。
@property (readwrite,copy) NSString *col_item1;
@property (readwrite,copy) NSString *col_item2;
@property (readwrite,copy) NSString *col_item3;

@end


</pre><p></p><div></div><p><span style="font-family:Arial Black; font-size:12px"><strong>M文件</strong></span></p><p><span style="font-family:Arial Black; font-size:12px"><strong></strong></span></p><pre code_snippet_id="370405" snippet_file_name="blog_20140530_5_6425540" name="code" class="objc">//
//  Table_DS_Main_Row_Items.m
//  test_tableview_2
//
//  Created by EDU on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//
/*
 Function : 此文件是表格的一行:表示有三个字符串列
 */
#import "Table_DS_Main_Row_Items.h"

@implementation Table_DS_Main_Row_Items

@synthesize col_item1;
@synthesize col_item2;
@synthesize col_item3;

@end



STEP4

设定表格每列的Identity值。是

Table_DS_Main_Row_Items

里面的属性。

系统自动生成的两个文件代码不需要修改

H

//
//  EDUAppDelegate.h
//  test_tableview_2
//
//  Created by DMD on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface EDUAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@end


M

//
//  EDUAppDelegate.m
//  test_tableview_2
//
//  Created by DMD on 30/5/14.
//  Copyright (c) 2014 EDU. All rights reserved.
//

#import "EDUAppDelegate.h"

@implementation EDUAppDelegate
// _window 这个是系统自动根据H定以后,自动前面加一个下划线
@synthesize window = _window;
- (void)dealloc
{
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    _window.title = @"test a table view";
}

@end


STEP5

测试编译OK!

看图


完。

2014-5-30 BY DMD

欢迎转载!