NSTableView 表格操作:增加,删除,编辑(方法2)
在:
NSWindowController
新建表单
(H,M,XIB三个文件+新建一个类放CellData)
1.不使用delegate
2.数据源直接是当前文件File‘s Owner
3.H继承NSTableView协议,将需要的几个函数放入
4.增加一个列表数据单元类
这个方法的特点是:
当新建立一个窗体,显示一个表格内容,不使用Deleget就少了一个类的2个文件,让程序简单化
操作步骤:
STEP1 将NSTableView的DataSource拉向File‘s Owner(这一步相当于之前用另外一个类和Deleget作为表格的数据源)
STEP2 将这个控件在H里面申明
STEP3 在XIB对应的H里面增加这个控件的协议
STEP4 在M文件里面,需要将协议必备的几个函数写入,并且修改对应的代码
注意:数据源和定义申明的时候,选择表格(不包括标题),选择2次就可以选中
注意:每个列:ID值是数据单元中申明的变量,需要复制,不能手动选择
本人测试成功!
以下是源代码
表格对应的数据单元
H文件
@interface List_Column :
NSObject
{
NSString *col_no;
}
@property (readwrite,copy)
NSString *col_no;
@end
M文件
#import "List_Column.h"
@implementation List_Column
@synthesize col_no;
@end
XIB对应的类,这个类用来作为表格的DataSource
H文件
#import <Cocoa/Cocoa.h>
#import "List_Column.h"
@interface List :
NSWindowController <NSTableViewDataSource>
{
NSMutableArray *m_table_rows;
IBOutlet NSTableView *m_table_list;
NSThread *m_thread_load_list;
}
@end
M文件
#import “List.h"
@interface List ()
@end
static
bool g_can_click_load =
true;
@implementation
List
- (id)init
{
if (![super
initWithWindowNibName:@"List"])
{
return
nil;
}
m_table_rows = [[NSMutableArray
alloc] init];
[self
Load];
return
self;
}
// Show Top 1 ++
- (IBAction)showWindow:(id)sender
{
[[NSApplication
sharedApplication] runModalForWindow:self.window];
}
-(void)closeModalWindow:(id)sender
{
[[NSApplication
sharedApplication] stopModal];
}
- (void)windowWillClose:(NSNotification *)notification
{
[self
performSelectorOnMainThread:@selector(closeModalWindow:)
withObject:nil
waitUntilDone:NO];
}
// Show Top 1 --
//---
- (id)initWithWindow:(NSWindow *)window
{
self = [super
initWithWindow:window];
if (self)
{
// Initialization code here.
}
return
self;
}
- (void)windowDidLoad
{
[super
windowDidLoad];
}
-(void)Load
{
if (true ==
g_can_click_load)
{
g_can_click_load =
false;
}
else
{
return ;
}
[self
thread_do_load];
}
-(void)thread_do_load
{
//主线程:不需要申明变量
//[self performSelectorOnMainThread:@selector(thread_function_main) withObject:self waitUntilDone:YES];
//次线程,需要申明
m_thread_load_list = [[NSThread
alloc] initWithTarget:self
selector:@selector(thread_do_load_function)
object:nil];
//次线程开始
[m_thread_load_list
start];
}
-(void)thread_do_load_function
{
[m_table_rows
removeAllObjects];
[m_table reloadData];
[self
TableView_FullData];
g_can_click_load =
true;
[m_thread_load_list
cancel];
m_thread_load_list =
nil;
}
-(void)TableView_FullData
{
int count = (int)contact_groups.size();
for (int i=0; i<count; i++)
{
text=[NSString
stringWithFormat:@"%d",i+1];
List_Column *newRecord = [[List_Column
alloc]
init];
newRecord.col_no = text;
[m_table_rows
addObject:newRecord];
[m_table reloadData];
[m_table
scrollRowToVisible:[m_table_rows
count] -
1];
}
}
// 表格 +++
// 以下是对控件NSTableView控件的支持函数
#pragma mark -
#pragma mark ***** Required Methods (unless bindings are used) *****
//[TableView Must Be]+++++
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
NSInteger index_value=[m_table_rows
count];
return index_value;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn
*)tableColumn row:(NSInteger)row
{
List_Column *rows =[m_table_rows
objectAtIndex:row];
return [rows valueForKey:[tableColumn
identifier]];
}
//[TableView Must Be]----
#pragma mark -
#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
{
List_Column *rows = [m_table_rows
objectAtIndex:row];
[rows
setValue:object forKey:[tableColumn
identifier]];
}
- (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray
*)oldDescriptors;
{
[m_table_rows
sortUsingDescriptors:[tableView sortDescriptors]];
[tableView
reloadData];
}
#pragma mark ***** Optional Methods ***** [----]
@end
test OK!
2014-9-26 BY DMD 总结(此方法比之前的方法又简单了一大步)!