macOS學習筆記(6)表格視圖2

在上一篇文章中到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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章