面板和警告框

NSPanel

用来显示辅助性内容的窗口面板。典型的有文件打开,保存对话框,颜色/字体选择面板等。

新建一个工程命名为NSPanel,拖动一个Panel控件到xib文件导航区,完成面板panel的创建.
NSPanel继承自NSWindow,因此很多属性设置跟NSWindow相同。

PanelXib

UI属性设置

title:panel面板的标题文字。

Controls:窗口最大最小化关闭各种按钮

Behabior:重要的是Visible At Launch这个选项,启动时是否显示出来,一般情况下都是点击取消这个选项,而由程序控制是否显示Panel。

Style:可以改变panel的皮肤外观,如果选择HUD Panel样式就是一个很cool的黑panel了。
PanelStyleHUD

显示panel面板

以HUD黑panel为例,我们创建一个登录界面。修改panel标题为User Login,增加label,textfield,button控件到panel上。注意要修改label的text color为白色。button按钮绑定响应事件oKButtonClicked.

绑定panel对象到loginPanel变量对象,增加一个按钮到window视图区,给按钮绑定响应事件loginButtonClicked。

调用window的beginSheet方法显示panel,completionHandler回调函数中可以做用户点击确定后的逻辑处理。

[ self.window beginSheet:self.loginPanel completionHandler:^(NSModalResponse returnCode) {
        NSString *userName = self.userNameField.stringValue;
        NSString *password = self.passwordField.stringValue;
        NSLog(@"userName %@",userName);
        NSLog(@"password %@",password);
}];

PanelShowHide

隐藏Panel

执行window的endSheet方法。

-(IBAction)oKButtonClicked:(id)sender {
    [self.window endSheet:self.loginPanel];
}

打开文件NSOpenPanel

我们通过菜单来说明如何使用文件对话框来打开文件。我们通过打开一个txt文件,读取文件内容,显示到textView多行文件显示框中。

找到File菜单中的Open...菜单项,修改响应事件action,绑定到新的openFilePanel方法上。
OpenFileAction

canChooseFiles:是否允许选择文件

canChooseDirectories:是否允许选择目录

allowsMultipleSelection: 是否允许多选

allowedFileTypes:允许的文件名后缀

URLs:保存用户选择的文件/文件夹路径path

- (IBAction)openFilePanel:(id)sender {
    NSOpenPanel *openDlg = [NSOpenPanel openPanel];
    openDlg.canChooseFiles = YES ;
    openDlg.canChooseDirectories = YES;
    openDlg.allowsMultipleSelection = YES;
    openDlg.allowedFileTypes = @[@"txt"];
    [openDlg beginWithCompletionHandler: ^(NSInteger result){
        if(result==NSFileHandlingPanelOKButton){
            NSArray *fileURLs = [openDlg URLs];
            for(NSURL *url in fileURLs) {
                NSError *error;
                NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
                if(!error){
                    self.textView.string = string;
                }
            }
        }
    }];
}

使用Mac上文本管理App创建一个txt文本文件,输入一些内容,命名为my.txt,保存到桌面。

点击菜单中的open打开文件选择对话框,选择我们的文件my.txt, 可以看到textView中已经显示为my.tx文件内容了。
OpenTxtFile

OpenTxtFileShow

保存文件NSSavePanel

我们可以修改textView多行文件显示框的内容,然后保存到原来的文件。

找到File菜单中的Save菜单项,修改响应事件action,绑定到新的saveFilePanel方法上。

修改textView,增加一行文字内容。点击文件菜单中的Save,保存textView修改过的内容到my.txt文件中。
SaveFileTxt

title:面板的标题

message:详细信息,可以为不设置。

allowedFileTypes:要保存的文件后缀名

nameFieldStringValue:要保存的文件名,可修改

- (IBAction)saveFilePanel:(id)sender {
    NSSavePanel *saveDlg = [[NSSavePanel alloc]init];
    saveDlg.title = @"Save File";
    saveDlg.message = @"Save My File";
    saveDlg.allowedFileTypes = @[@"txt"];
    saveDlg.nameFieldStringValue = @"my";
    [saveDlg beginWithCompletionHandler: ^(NSInteger result){
        if(result==NSFileHandlingPanelOKButton){
            NSURL  *url =[saveDlg URL];
            NSLog(@"filePath url%@",url);
            NSString *text = self.textView.string;
            NSError *error;
            [text writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:&error];
            if(error){
                NSLog(@"save file error %@",error);
            }
        }
    }];
}

颜色选择面板

需要用户设置颜色时,可以使用颜色选择面板来选择合适的颜色。

Colo

创建颜色面板,绑定选择事件,使用orderFront来显示它。

NSColorPanel *colorpanel = [NSColorPanel sharedColorPanel];
[colorpanel setAction:@selector(changeColor:)];
[colorpanel setTarget:self];
[colorpanel orderFront:nil];

颜色选择action事件

- (void)changeColor:(id)sender {
    NSColorPanel *colorPanel = sender ;
    NSColor* color = colorPanel.color;
}

字体选择面板

需要用户选择设置字体时,使用字体选择面板来选择合适的字体。

Font

创建面板

NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager setDelegate:self];
[fontManager setTarget:self];
[fontManager orderFrontFontPanel:self];

字体选择变化后的代理方法

- (void)changeFont:(id)sender {
     self.font = [sender convertFont:self.font];
}

这里要注意的是必须先定义一个font属性变量,进行初始化赋值。然后选择新的字体的时候changeFont方法中才能获取到当前选择的font。

NSAlert

用来显示提示信息的面板窗口。

基本属性设置

messageText: 提示信息标题

informativeText:提示信息详细内容

icon:对应的一个图标,可以不设置为空。为空时根据下面的alertStyle样式决定使用默认的图标。

alertStyle:警告样式定义,分别为基本的/提示性的/严重的 三种。

@property (copy) NSString *messageText;
@property (copy) NSString *informativeText;
@property (null_resettable, strong) NSImage *icon;
@property NSAlertStyle alertStyle;

增加按钮

使用addButtonWithTitle:方法向警告界面增加按钮。最多可以增加3个按钮,存储在buttons属性中。

- (NSButton *)addButtonWithTitle:(NSString *)title;
@property (readonly, copy) NSArray<NSButton *> *buttons;

每个按钮点击后,回调方法中的返回值returnCode的定义如下

typedef NSInteger NSModalResponse ;

enum {
    NSAlertFirstButtonReturn          = 1000,
    NSAlertSecondButtonReturn         = 1001,
    NSAlertThirdButtonReturn          = 1002
};

可以根据不同的值区分不同的流程来处理。

使用示例

我们做一个用户注册的界面,对用户输入的密码长度检查,长度小于6位时提示错误。

先创建一个新工程,从控件箱拖动Label文本标签,3个输入框,2个按钮到window界面。绑定文本输入框到Outlet变量,绑定Register按钮的事件到registerButtonClicked:方法。

RegisterRun

- (IBAction)registerButtonClicked:(id)sender {
    NSString *password = self.passwordField.stringValue;
    if([password length]<6) {
        NSAlert *alert = [[NSAlert alloc] init];
        //增加一个按钮
        [alert addButtonWithTitle:@"Ok"];
        //提示的标题
        [alert setMessageText:@"Alert"];
        //提示的详细内容
        [alert setInformativeText:@"password length must be more than 6 "];
        //设置告警风格
        [alert setAlertStyle:NSInformationalAlertStyle];
        //开始显示告警
        [alert beginSheetModalForWindow:self.window
                      completionHandler:^(NSModalResponse returnCode){
                       //用户点击告警上面的按钮后的回调
                 }
         ];
        return;
    }
}

RegisterAlert