macOS UI 对话框!储存面板增加自定功能

对话框!储存面板增加自定功能

储存对话框(面板)功能

之前文章中已经有介绍开启与储存对话框(面板)功能如何使用,但如果你要自定一些功能在存档时让使用者选择,那就需要自订一些功能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与对话框整合。

范例程式

Panel Add Options

参考资讯

File System Programming Guide