对话框!储存面板增加自定功能
储存对话框(面板)功能
之前文章中已经有介绍开启与储存对话框(面板)功能如何使用,但如果你要自定一些功能在存档时让使用者选择,那就需要自订一些功能View让NSSavePanel
使用。
增加功能元件
开启与储存对话框除了内建的选择供选择外,也可以自定一些功能后,利用setAccessoryView
将整个View加入自定功能区块,也就是上图中绿框处,例子中我们新增一个可以用点选的方式来选择档案类型,这功能也是最常用到的功能,后面会介绍如何完成这个功能。
绘制增加功能View
新增一个View,并且命名为PanelExtra.xib
,视需要也可以自行订名称(后面再自行将程式内容做更改),
并且再自行绘制像这样的元件,看完这篇学会怎么增加自定功能后,View的内容就由您自已来设计了,此次范例所需要的画面如下:
增加一个Format
的选项让使用者选择档案类型,接下来的内容就由程式来完成。
取得增加功能View物件
现在所需要提到的内容为新增的功能,针对这程式一开始必需要先载入刚刚画好的View,但View是存入Layout的资源档,所以我们需要载入资源档:
//-----------start----------- NSNib *accessoryNib = [[NSNib alloc] initWithNibNamed:@"PanelExtra" bundle:nil];//读取Layout nib //------------end------------
载入后必需要将里面的View物件将它取出来:
//-----------start----------- NSUInteger viewIndex = [arrayOfViews indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [obj isKindOfClass:[NSView class]];//取得nib内容上的view,因在Layout上只有一个view }]; //------------end------------
取出来的View也就是先前图中的Custome View
,正常来说你取得View之后就能直接在NSSavePanel
进行设定,但这些自建的功能必需要跟使用者互动,因此我们要利用取得的View寻找我们所配置的Format选项NSPopupButton
物件,进行事件的设定,如此就能在使用者变更选项时能得到结果:
//-----------start----------- self.accessoryView = [arrayOfViews objectAtIndex:viewIndex];//取得view中的所有元件 NSUInteger poputButtonIndex = [self.accessoryView.subviews indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [obj isKindOfClass:[NSPopUpButton class]];//取得view中为NSPopUpButton元件(layout上只有1个,所以直接找到后回传物件位址) }]; //------------end------------
增加功能View的事件
前面已经取得Layout资源档的物件,之后我们要再次利用一样的方法将Format
的物件取得:
//-----------start----------- self.popupButton = [self.accessoryView.subviews objectAtIndex:poputButtonIndex]; //设定NSPopUpButton的事项 self.popupButton.target = self; self.popupButton.action = @selector(fileTypeChanged:);//选择改变后执行fileTypeChanged [self.popupButton removeAllItems]; [self.popupButton addItemsWithTitles:@[@"*.png",@"*.jpg"]];//指定PopUpButton 项目 //------------end------------
其取得的意义在于要设定一些事件,像.action
就是当使用者按选择好选项时就会执行这个事件,addItemsWithTitles
的Method可以自行用程式增加选项内容,这次示范的是增加*.png
与*.jpg
。
fileTypeChanged
对话框开启时,会有一个让我们输入档名的输入栏位,这个需要使用nameFieldStringValue
Method取得输入档名栏位上的内容:
//-----------start----------- NSString *nameWithoutExtension = [[_savePanel nameFieldStringValue] stringByDeletingPathExtension]; //------------end------------
之后使用者进行互动选择Format时,上述程式会本据选择的结果进行处理,如果选择*.png
,那indexOfSelectedItem
的值会是0
,我们利用stringByDeletingPathExtension
将原先的副档名删除,再利用stringByAppendingPathExtension
补上指定的副档名png
。
//-----------start----------- - (void)fileTypeChanged:(id)sender { //选项变更后进行副档的处理,选择副档后将原本的副档名取代 NSString *nameWithoutExtension = [[_savePanel nameFieldStringValue] stringByDeletingPathExtension]; switch ([self.popupButton indexOfSelectedItem]) { case 0: { _savePanel.allowedFileTypes = @[@"png"]; [_savePanel setNameFieldStringValue:[nameWithoutExtension stringByAppendingPathExtension:@"png"]]; NSLog(@"0"); break; } case 1: { _savePanel.allowedFileTypes = @[@"jpg"]; [_savePanel setNameFieldStringValue:[nameWithoutExtension stringByAppendingPathExtension:@"jpg"]]; NSLog(@"1"); break; } } } //------------end------------
设定增加功能View
程式中我们将增加功能的View当成物件并使用变数accessoryView
来控制,前面都将需要设定的程式码都准备完成,下面只需要将View用setAccessoryView
指定就完成:
//-----------start----------- [panel setAccessoryView:self.accessoryView];//将取得的view指定至Panel,它会在显示区域将View显示 //------------end------------
其他的开启对话框方式都与般的使用方式一样,但不同的事开启对话框后会看到增加功能的View与对话框整合。