[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

欢迎转载!

[Cocoa-4th] Chapter6 - NSTableView表格增删改 (详尽介绍2),布布扣,bubuko.com

时间: 2024-07-30 10:19:11

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

javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

jsp页面表格布局Html代码 <body > <center> <input type="text" value="111" id="mytext"> <table border="1" width="60%" id="mytable"> <tr> <td id="td1">第一行第一列<

asp.net下利用MVC模式实现Extjs表格增删改查

在网上看到有很多人写extjs下的表格控件的增删改查,但是大多数都是直接从后台读取数据,很少有跟数据库进行交互的模式. 今天就来写一个这样的例子.欢迎大家交流指正. 首先简单介绍一下MVC模式,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写. Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分.通常模型对象负责在数据库中存取数据. View(视图) 是应用程序中处理数据显示的部分.通常视图是依据模型

Angular4 后台管理系统搭建(3) - wijmo5 flexgrid表格增删改按钮实现

这章应该是wijmo5 flexgrid表格应用的最后一章,我们在三章内介绍了flexgrid表格组件的数据绑定,分页器搭建,单元格模板控制和代码重绘单元格控制.这章在介绍下对表格添加增删改三个按钮.有了这些功底以后做angular的项目,使用wijmo5 flexgrid组件.基本上是够用了.还有一些比如内部编辑,合并,子表格什么的需要了在去熟悉即可. 首先是要在ts文件内找到html模板内的表格对象.这个用@ViewChild 这个指令实现.我们看下实现,首先是html模板 对表格组件,我们

js_表格的增删改

学到后面发现前面的内容都不是很巩固了. 知道自己的不足之后,最近在复习一些学过的知识. 用js做了一个还不是完美表格增删改.(只适合列数比较少的表格) 贴上代码: html: <div class="goods_info"> <table class="goods_ctg"> <caption class="ctg_caption"> 商品类别信息 </caption> <thead>

MYSQL注入天书之数据库增删改介绍

Background-4 增删改函数介绍 在对数据进行处理上,我们经常用到的是增删查改.接下来我们讲解一下mysql 的增删改.查就是我们上述总用到的select,这里就介绍了. 增加一行数据.Insert 简单举例 insert into users values('16','lcamry','lcamry'); ? 删除 ? 2.删数据:?? delete?from?表名;?? delete?from?表名?where?id=1;?? ? 删除结构:?? 删数据库:drop?database

elasticsearch的简单增删改查操作

1.首先弄明白四个概念 elasticsearch 关系型数据库 index 数据库 type 表 document 行 field 字段 如果刚一开始理解比较困难,那你就在心中默念100遍,10遍也可以... 如果你做过面向对象开发,我觉得elasticsearch的这四个概念还是很好理解的. 需要重点说明的是document就是一个json格式的字符串,里面包括N个字段.我们可以想象将面向对象语言里面的一个对象序列化成json字符串. 关系型数据库需要先建库,再建表.elasticsearc

ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查

原文:ASP.NET CORE系列[二]使用Entity Framework Core进行增删改查 介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本.对于EF而言 EF core 包含许多提升和新特性,同时 EF core 是一个全新的代码库,并不如 EF6 那么成熟和稳定.EF core 保持了和EF相似的开发体验,大多数顶级API都被保留了下来,所以,如果你用过EF6,那么上手EF core你会觉得非常轻松和熟悉,EF core 构建在一

JS增删改HTML表格

要求如下: 写一个html页面,里面有一个表格,储存用户信息,包括:用户名,密码,姓名,邮箱,电话,qq,身份证号. 现在要通过js对表格进行动态的增删改查(只是内存操作即可): 首先,加载页面时用js加载3条初始化记录: 有一个增加记录的按钮,点击后弹出一个div层提供输入,要求各字段必须符合输入格式且不能为空: 用户名:英文+数字+下划线: 密码:英文+数字+下划线+6位以上: 姓名:中文: 邮箱,电话,qq,身份证号符合格式: 每条记录有修改.删除: 修改类似增加,要把原来值读出来: HT

表格的增删改查

这周,复习了JS的操作,并用更简捷的代码,实现了表格的增删改查!   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">   <html>   <head>   <meta charset="utf-8">   <title><