在上一篇文章中到tableview中加入新功能:
加入按钮,按下后多一行;
数字格式转换;
实现菜单按钮动作,弹出保存文件和打开文件对话框;
列表里price用集合排序。
未实现功能:
按下退出时,弹出确认退出对话框;
跟踪内存管理。
FoodItem.m:
-(id)initWithCoder:(NSCoder *)coder
{
[super init];
//用数据流解码对象来初始化属性生成实例变量
[self setName:[coder decodeObject]];
[self setPrice:[coder decodeObject]];
return self;
}
-(void)encodeWithCoder:(NSCoder*)coder
{
//把实例变量编码到数据流中
[coder encodeObject:[self name]];
[coder encodeObject:[self price]];
}
//增加比较方法
-(NSComparisonResult)compareName:(FoodItem *)item
{
return [name compare:[item name]];
}
-(NSComparisonResult)comparePrice:(FoodItem *)item
{
return [price compare:[item price]];
}
MyDataSource.h:
@interface MyDataSource : NSObject {
//数据源->表格的行列数据
NSMutableArray* items;
//按钮按下的动作->调用MyDataSource的接收方法
//把view中的视图抽象插座变量table->tableview视图
IBOutlet NSTableView *table;
}
-(IBAction)newButtonPressed:(id)sender;
-(IBAction)save:(id)sender;
-(IBAction)open:(id)sender;
-(IBAction)exit:(id)sender;
@end
MyDataSource.m:
-(IBAction)newButtonPressed:(id)sender
{
FoodItem * item=[[FoodItem alloc] init];
[items insertObject:item atIndex:[items count]];
[item release];
[table reloadData];
//[table selectRow:0 byExtendingSelection:NO];
}
-(IBAction)save:(id)sender
{
//创建文件保存面板
NSSavePanel*savePanel=[NSSavePanel savePanel];
//获取回调方法的选标
SEL sel=@selector(savePanelDidEnd:returnCode:contextInfo:);
//指示文件保存面板
[savePanel beginSheetForDirectory:@"~/Documents"
file:@"menu.items"
modalForWindow:[table window]
modalDelegate:self
didEndSelector:sel
contextInfo:nil];
}
-(void)savePanelDidEnd:(NSSavePanel*)sheet
returnCode:(int)returnCode
contextInfo:(void*)context
{
//获得要保存的文件的状态码
if(returnCode==NSOKButton)
{
[NSArchiver archiveRootObject:items toFile:[sheet filename]];
}
}
-(IBAction)open:(id)sender
{
NSOpenPanel* openPanel=[NSOpenPanel openPanel];
SEL sel=@selector(openPanelDidEnd:returnCode:contextInfo:);
[openPanel beginSheetForDirectory:@"~/Documents"
file:nil
types:nil
modalForWindow:[table window]
modalDelegate:self
didEndSelector:sel
contextInfo:nil];
}
-(void)openPanelDidEnd:(NSOpenPanel*)sheet
returnCode:(int)returnCode
contextInfo:(void*)context
{
if(returnCode==NSOKButton)
{
//从选中文件中重建数组对象到存档,释放分配给items到旧数组,将保持到新数组赋给它
NSMutableArray*array;
array=[NSUnarchiver unarchiveObjectWithFile:[sheet filename]];
[array retain];
[items release];
items=array;
[table reloadData];
}
}
-(IBAction)exit:(id)sender
{
NSAlert*alert=[[NSAlert alloc] init];
[alert addButtonWithTitle:@"Yes"];
[alert addButtonWithTitle:@"No"];
[alert setMessageText:@"Delete the record?"];
[alert setInformativeText:@"Deleted records cannot be restored."];
[alert setAlertStyle:NSWarningAlertStyle];
int rs = [alert runModal] ;
if (rs == NSAlertFirstButtonReturn)
{
NSLog(@"Click Yes !");
}
else
{
NSLog(@"Click No!");
}
[alert release];
}
//从列获得标识符,指示数组用比较方法排序,通知后台重新载入视图
-(void)tableView:(NSTableView *)tableView
didClickTableColumn:(NSTableColumn *)tableColumn
{
NSString*identifier=[tableColumn identifier];
if([identifier isEqualToString:@"name"])
{
[items sortUsingSelector:@selector(compareName:)];
}else {
[items sortUsingSelector:@selector(comparePrice:)];
}
[table reloadData];
}