macOS学习笔记(6)表格视图2

本文详细介绍如何在TableView中添加新功能,包括按钮操作、数字格式转换、菜单按钮交互及列表排序。通过实现按钮功能,如新增行、保存与打开文件,以及退出确认对话框,提升用户体验。同时,讲解了FoodItem类的编码与解码方法,以及MyDataSource类的事件处理,如保存、打开文件面板的使用,和退出时的确认流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章中到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];
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值