在上一篇文章中到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];
}