用来显示辅助性内容的窗口面板。典型的有文件打开,保存对话框,颜色/字体选择面板等。
新建一个工程命名为NSPanel,拖动一个Panel控件到xib文件导航区,完成面板panel的创建.
NSPanel继承自NSWindow,因此很多属性设置跟NSWindow相同。
title:panel面板的标题文字。
Controls:窗口最大最小化关闭各种按钮
Behabior:重要的是Visible At Launch这个选项,启动时是否显示出来,一般情况下都是点击取消这个选项,而由程序控制是否显示Panel。
Style:可以改变panel的皮肤外观,如果选择HUD Panel样式就是一个很cool的黑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);
}];
执行window的endSheet方法。
-(IBAction)oKButtonClicked:(id)sender {
[self.window endSheet:self.loginPanel];
}
我们通过菜单来说明如何使用文件对话框来打开文件。我们通过打开一个txt文件,读取文件内容,显示到textView多行文件显示框中。
找到File菜单中的Open...菜单项,修改响应事件action,绑定到新的openFilePanel方法上。
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文件内容了。
我们可以修改textView多行文件显示框的内容,然后保存到原来的文件。
找到File菜单中的Save菜单项,修改响应事件action,绑定到新的saveFilePanel方法上。
修改textView,增加一行文字内容。点击文件菜单中的Save,保存textView修改过的内容到my.txt文件中。
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);
}
}
}];
}
需要用户设置颜色时,可以使用颜色选择面板来选择合适的颜色。
创建颜色面板,绑定选择事件,使用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;
}
需要用户选择设置字体时,使用字体选择面板来选择合适的字体。
创建面板
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。
用来显示提示信息的面板窗口。
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:方法。
- (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;
}
}