[Cocoa-4th] Chapter6 - NSTableView 表格操作:增加,删除,编辑
功能:使用NSTableView 进行表格的增加,删除和编辑
STEP1
新建一个工程
STEP2
增加1个类,里面增加一个协议
代码如下
H
//
// TableView_DS_1.h
// test_tableview_1
//
// Created by DMD on 30/5/14.
// Copyright (c) 2014 EDU. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface TableView_DS_1 : NSObject <NSTableViewDataSource>
@property (retain) NSMutableArray *row_items;
@property (assign) IBOutlet NSTextField *m_EDIT_1;
@property (assign) IBOutlet NSTextField *m_EDIT_2;
@property (assign) IBOutlet NSTextField *m_EDIT_3;
@property (assign) IBOutlet NSTextField *m_EDIT_4;
@property (assign) IBOutlet NSTableView *m_TableView1;
-(void)clear_edit;
-(void)init_values;
-(void)full_values_in_tableview;
@end
M
//
// TableView_DS_1.m
// test_tableview_1
//
// Created by DMD on 30/5/14.
// Copyright (c) 2014 EDU. All rights reserved.
//
#import "TableView_DS_1.h"
#import "TableView_DS_1_RowItems.h"
@implementation TableView_DS_1
@synthesize row_items;
@synthesize m_EDIT_1;
@synthesize m_EDIT_2;
@synthesize m_EDIT_3;
@synthesize m_EDIT_4;
@synthesize m_TableView1;
- (id)init
{
self = [super init];
if (self)
{
//初始化列直
row_items = [[NSMutableArray alloc] init];
//init edit control
//[self init_values]; // It's not work!
//调用自己的函数,给table一些行
[self full_values_in_tableview];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
#pragma mark - NSTableViewDataSource +++
#pragma mark * Required Methods (unless bindings are used) *
//must be
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return [row_items count];
}
//must be
- (id)tableView:(NSTableView *)theTableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
TableView_DS_1_RowItems *row_item = [row_items objectAtIndex:row];
return [row_item valueForKey:[tableColumn identifier]];
}
#pragma mark ***** Optional Methods *****
//Edit Value
-(void)tableView:(NSTableView *)theTableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
TableView_DS_1_RowItems *row_item = [row_items objectAtIndex:row];
[row_item setValue:object forKey:[tableColumn identifier]];
}
//for sort
- (void)tableView:(NSTableView *)theTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
[row_items sortUsingDescriptors:[m_TableView1 sortDescriptors]];
[m_TableView1 reloadData];
}
#pragma mark - NSTableViewDataSource ---
-(void)init_values
{
m_EDIT_1.stringValue=@"m_EDIT_1";
m_EDIT_2.stringValue=@"m_EDIT_2";
m_EDIT_3.stringValue=@"m_EDIT_3";
m_EDIT_4.stringValue=@"m_EDIT_4";
}
// 给TableView增加一些行,可以在初始化里面调用,本函数自定义的,非系统生成
-(void)full_values_in_tableview
{
//NSString *text;
int i=0;
int count_value=0;
NSString *text ;
for (i=0; i<6; i++)
{
TableView_DS_1_RowItems *newEmployee = [[TableView_DS_1_RowItems alloc] init];
count_value=count_value+2;
text=[NSString stringWithFormat:@"columne%d",count_value];
newEmployee.column1 = text;
count_value=count_value+2;
text=[NSString stringWithFormat:@"columne%d",count_value];
newEmployee.column2 = text;
count_value=count_value+2;
text=[NSString stringWithFormat:@"columne%d",count_value];
newEmployee.column3 = text;
count_value=count_value+2;
text=[NSString stringWithFormat:@"columne%d",count_value];
newEmployee.column4 = text;
[row_items addObject:newEmployee];
[m_TableView1 reloadData];
[m_TableView1 scrollRowToVisible:[row_items count] - 1];
}
}
- (IBAction)OnBT_Add:(id)sender
{
TableView_DS_1_RowItems *new_row_items = [[TableView_DS_1_RowItems alloc] init];
new_row_items.column1 = m_EDIT_1.stringValue;
new_row_items.column2 = m_EDIT_2.stringValue;
new_row_items.column3 = m_EDIT_3.stringValue;
new_row_items.column4 = m_EDIT_4.stringValue;
[row_items addObject:new_row_items];
[m_TableView1 reloadData];
[m_TableView1 scrollRowToVisible:[row_items count] - 1];
[self clear_edit];
[self init_values];
}
-(void)clear_edit
{
NSString *value1=@"";
m_EDIT_1.stringValue=value1;
m_EDIT_2.stringValue=value1;
m_EDIT_3.stringValue=value1;
m_EDIT_4.stringValue=value1;
}
- (IBAction)OnBT_Edit:(id)sender
{
NSInteger row = [m_TableView1 selectedRow];
if (row == -1)
return;
TableView_DS_1_RowItems *new_row_items = [row_items objectAtIndex:row];
new_row_items.column1 = m_EDIT_1.stringValue;
new_row_items.column2 = m_EDIT_2.stringValue;
new_row_items.column3 = m_EDIT_3.stringValue;
new_row_items.column4 = m_EDIT_4.stringValue;
//- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
[row_items replaceObjectAtIndex:row withObject:new_row_items];
[m_TableView1 reloadData];
[m_TableView1 scrollRowToVisible:[row_items count] - 1];
}
- (IBAction)OnBT_Delete:(id)sender
{
// Which row is selected?
NSIndexSet *rows = [m_TableView1 selectedRowIndexes];
// Is the selection empty?
if ([rows count] == 0)
{
NSBeep();
return;
}
[row_items removeObjectsAtIndexes:rows];
[m_TableView1 reloadData];
}
- (IBAction)OnBT_Refresh:(id)sender
{
[self init_values];
}
- (IBAction)OnTableView_SelectedRow:(id)sender
{
NSInteger row = [m_TableView1 selectedRow];
if (row == -1)
return;
TableView_DS_1_RowItems *row_item = [row_items objectAtIndex:row];
m_EDIT_1.stringValue = [row_item valueForKey:@"column1"];
m_EDIT_2.stringValue = [row_item valueForKey:@"column2"];
m_EDIT_3.stringValue = [row_item valueForKey:@"column3"];
m_EDIT_4.stringValue = [row_item valueForKey:@"column4"];
}
- (IBAction)OnBT_DeleteAll:(id)sender
{
[row_items removeAllObjects];
[m_TableView1 reloadData];
}
@end
STEP3
增加一个类,主要是表达:表格有多少列,每列的类型
H
//
// TableView_DS_1_RowItems.h
// test_tableview_1
//
// Created by DMD on 30/5/14.
// Copyright (c) 2014 EDU. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface TableView_DS_1_RowItems :NSObject
@property (readwrite,copy)NSString *column1;
@property (readwrite,copy)NSString *column2;
@property (readwrite,copy)NSString *column3;
@property (readwrite,copy)NSString *column4;
@end
M
//
// TableView_DS_1_RowItems.m
// test_tableview_1
//
// Created by DMD on 30/5/14.
// Copyright (c) 2014 EDU. All rights reserved.
//
#import "TableView_DS_1_RowItems.h"
@implementation TableView_DS_1_RowItems
@synthesize column1;
@synthesize column2;
@synthesize column3;
@synthesize column4;
@end
STEP4
在主窗口Main_Menu.xib里面放入1个NSTableView,然后一个增加按钮,一个删除按钮,一个编辑按钮,3个编辑框。
STEP5
在控件面板里面找到Object,拖动到窗口界面左边,这是一个连接器,连接窗口和类。
设定这个连接器的Class是STEP2生成的类。
STEP6
然后将界面的控件分别按住CTRL按键,拉动到STEP2生成的类里面,有的是属性,有的是函数,属性放入H,函数放入m
然后设置NSTableView的DataSource,右击,拉动到连接器上,就可以了。
然后给每一列都要设置Identity,将STEP3生成的类的属性分别放入不同列中。
STEP7
运行编译!OK!
注意:
在STEP2生成的类中,一定要写初始化init函数,将NSMutableArray *row_items;初始化。