[MacOS NSAlert的使用]

源:http://helloitworks.com/863.html

NSAlert用于弹出一个确认对话框,在程序中被广泛地使用。常见的场景是用户删除数据,会弹出对话框给用户确认,免得用户不小心导致了误操作。

NSAlert可以采用Modal Window的方式展示

如图:

代码如下:

  1. //采用Modal Window的方式展示
  2. - (IBAction)ShowNSAlertWindow:(id)sender
  3. {
  4. NSAlert *alert = [NSAlert alertWithMessageText:@"messageText"
  5. defaultButton:@"defaultButton"
  6. alternateButton:@"alternateButton"
  7. otherButton:@"otherButton"
  8. informativeTextWithFormat:@"informativeText"];
  9. NSUInteger action = [alert runModal];
  10. //响应window的按钮事件
  11. if(action == NSAlertDefaultReturn)
  12. {
  13. NSLog(@"defaultButton clicked!");
  14. }
  15. else if(action == NSAlertAlternateReturn )
  16. {
  17. NSLog(@"alternateButton clicked!");
  18. }
  19. else if(action == NSAlertOtherReturn)
  20. {
  21. NSLog(@"otherButton clicked!");
  22. }
  23. }

NSAlert也可以采用Sheet的方式展示

如图:

代码如下:

  1. //采用Sheet的方式展示
  2. - (IBAction)ShowNSAlertSheet:(id)sender
  3. {
  4. NSMutableDictionary * extrasDict = [[NSMutableDictionary alloc] init];
  5. [extrasDict setObject:@"http://www.baidu.com" forKey:@"link"];
  6. NSAlert *alert = [NSAlert alertWithMessageText:@"messageText"
  7. defaultButton:@"defaultButton"
  8. alternateButton:@"alternateButton"
  9. otherButton:@"otherButton"
  10. informativeTextWithFormat:@"informativeText"];
  11. //__bridge_retained for arc
  12. [alert beginSheetModalForWindow:self.window
  13. modalDelegate:self
  14. didEndSelector:@selector(alertSheetDidEnd:returnCode:contextInfo:)
  15. contextInfo:(__bridge void *)(extrasDict )];
  16. }
  17. //响应Sheet的按钮事件
  18. - (void)alertSheetDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
  19. {
  20. if (returnCode == NSAlertDefaultReturn)
  21. {
  22. NSLog(@"alternateButton clicked!");
  23. //show you how to use contextInfo
  24. //__bridge_transfer for arc
  25. NSString *url = [(__bridge NSDictionary*)contextInfo objectForKey:@"link"];
  26. [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
  27. }
  28. else if(returnCode == NSAlertAlternateReturn )
  29. {
  30. NSLog(@"alternateButton clicked!");
  31. }
  32. else if(returnCode == NSAlertOtherReturn)
  33. {
  34. NSLog(@"otherButton clicked!");
  35. }
  36. }

源代码:https://github.com/helloitworks/NSAlert

=====================华丽的分割线=====================

可以说NSAlert是标准的,中规中矩,几乎可以应用到所有需要提示框的地方。但我们很难通过继承的方式来扩展NSAlert的功能,事实上NSAlert的设计初衷就是提供一个提示框标准,并不希望用户通过继承去自定义。
在特定的应用程序中,我们经常希望可以自己提供一个自定义窗口,并可以像NSAlert那样采用Modal Window的方式或者采用Sheet的方式来展示。比如黑色主题的程序希望这个NSAlert窗口是黑色的,而不是标准的灰白色,这样才显得和谐。

下面我通过继承NSObject的方式来实现一个SYXAlert类,SYXAlert类采用一个自定义的窗口SYXAlert来模拟NSAlert。

SYXAlert可以采用Modal Window的方式展示

如图:

代码如下:

  1. //采用Window的方式展示
  2. - (IBAction)ShowSYXAlertWindow:(id)sender
  3. {
  4. SYXAlert *alert = [SYXAlert alertWithMessageText:@"SYXAlertWindow" okButton:@"Ok" cancelButton:@"Cancel"];
  5. NSInteger action = [alert runModal];
  6. if(action == SYXAlertOkReturn)
  7. {
  8. NSLog(@"SYXAlertOkButton clicked!");
  9. }
  10. else if(action == SYXAlertCancelReturn )
  11. {
  12. NSLog(@"SYXAlertCancelButton clicked!");
  13. }
  14. }

注:modal对话框窗口左上角是没有Close、Minimize、Resize这些按钮的,所以在xib中去掉这些按钮

SYXAlert也可以采用Sheet的方式展示

如图:

代码如下:

  1. //采用Sheet的方式展示
  2. - (IBAction)ShowSYXAlertSheet:(id)sender
  3. {
  4. NSMutableDictionary * extrasDict = [[NSMutableDictionary alloc] init];
  5. [extrasDict setObject:@"http://www.baidu.com" forKey:@"link"];
  6. SYXAlert *alert = [SYXAlert alertWithMessageText:@"SYXAlertSheet" okButton:@"Ok" cancelButton:@"Cancel"];
  7. [alert beginSheetModalForWindow:self.window
  8. modalDelegate:self
  9. didEndSelector:@selector(alertSheetDidEnd:returnCode:contextInfo:)
  10. contextInfo:(__bridge void*)extrasDict];
  11. }
  12. //响应Sheet的按钮事件
  13. - (void)alertSheetDidEnd:(NSAlert *)alert
  14. returnCode:(NSInteger)returnCode
  15. contextInfo:(void *)contextInfo {
  16. if (returnCode == SYXAlertOkReturn)
  17. {
  18. NSLog(@"SYXAlertOkButton clicked!");
  19. //show you how to use contextInfo
  20. //__bridge_transfer for arc
  21. NSString *url = [(__bridge NSDictionary*)contextInfo objectForKey:@"link"];
  22. [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
  23. }
  24. else if(returnCode == SYXAlertCancelReturn )
  25. {
  26. NSLog(@"SYXAlertCancelButton clicked!");
  27. }
  28. }

注:xib的window属性有一个选项,就是visible at launch,默认是勾选,窗口无法采用sheet的方式附在父窗口上;勾掉,窗口才能采用sheet的方式附在父窗口上

源代码:https://github.com/helloitworks/SYXAlert

时间: 2024-10-07 00:40:33

[MacOS NSAlert的使用]的相关文章

macOS上,实现Wireshark手机抓包

1. 需要的硬件: Macbook Edimax EW-7822UAC无线网卡(如果买其他型号网卡,查看一下网卡的官网,确认有macOS的驱动) 需要的软件: Wireshark for macOS 2. 安装网卡驱动,重启动后,设置外置无线网卡EW-7822UAC连接到wifi网络. 3. 设置共享网络.注意,一定要把EW-7822UAC设置为"共享以下来源的连接",把内置网卡用于"用以下端口共享给电脑",如下图 点击上图的"Wi-Fi选项"按

luarocks在macOS系统上的安装

luarocks是基于lua开发的一个包管理工具,所以在安装luarocks之前需要先安装lua(见博客同目录下“lua在MacOS系统上的安装”).具体的安装步骤如下: 1.源码安装部署luarocks 其实除了源码安装,我们还有其他可以选择的安装方法,比如brew,apt-get,yum等,这里选择源码安装: $ wget http://luarocks.org/releases/luarocks-2.2.2.tar.gz $ tar zxvf luarocks-2.2.2.tar.gz $

macOS安装putty

本来是OS X,因为有了watchOS.iOS的命令方式(前面小写后面OS大写,一体化命令规则),估计未来OS X会更名为macOS. macOS上的免费ssh客户端软件并不多,我已知的有:vSSH Lite.Telnet Lite.Putty. 其中: vSSH Lite最烦人,老弹小窗提示你购买全功能版. Telnet Lite最好看.功能也够用. Putty 最难装,耗费了我好几个小时才装上. 综上:我个人选择Telnet Lite.原因:Telnet Lite好装.好看.好用.肯定要抛弃

macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16

ac系统上虽然自带PHP和Apache,但是有时不是我们想要的版本呢.今天我们就在macOS Sierra(10.12.1)上安装比较新的版本的PHP版本,也就是PHP7.0+了.本篇博客我们安装的Apache是2.4的版本, MySQL5.7.16.稍后会详细介绍这一过程. 一.安装前的准备 1.安装或更新Homebrew Homebrew就不做过多赘述了,也不是在博客中第一次提到了,是Mac上不可或缺的包包管理器.下方截图中是我本地使用的brew的版本信息,当然是目前最新的版本.在安装上述相

TODO:macOS编译PHP7.1

本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.gz 2.解压php-7.1.0.tar.gz包 3.创建配置 ./configure –prefix=/usr/local/php7 –with-apxs=/usr/sbin/apxs –enable-fpm –with-fpm-user=www –with-fpm-group=www –with-mysqli –with-pdo-my

CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

猿教程_-webapi教程-WebAPI教程 猿教程_-webapi教程-Web API概述 猿教程_-webapi教程-新建Web Api项目 猿教程_-webapi教程-测试Web API 猿教程_-webapi教程-Web API Controller 猿教程_-webapi教程-配置Web API 猿教程_-webapi教程-Web API路由 猿教程_-webapi教程-参数绑定 猿教程_-webapi教程-Action方法返回类型 猿教程_-webapi教程-Web API Requ

macOS、PowerPoint、Excel、Word快捷键

macOS快捷键 https://support.apple.com/zh-cn/HT201236 PowerPoint 2016 for Mac快捷键 https://support.office.com/zh-cn/article/PowerPoint-2016-for-Mac-中的键盘快捷键-f25f92b3-b0a8-4c60-aec8-954b72aa81ad?ui=zh-CN&rs=zh-CN&ad=CN Excel 2016 for Mac快捷键 https://suppor

MacOS的菜单状态栏App添加饼型进度

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52075418 使用swift如何开发一个MacOS的状态栏App,上一篇已经讲了.里面我忘记提如何修改状态icon为饼型进度.比如App在处理什么事情的时候,可以添加进度状态提示用户.如下图所示: /// 显示状态栏菜单饼型进度 private func showStatusItemProgress() { i

MacOS U盘安装

通过Mac上的App Store下载安装程序 插入U盘 启动终端 输入命令  sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/iPlaySoft --applicationpath //Applications/Install\ OS\ X\ El\ Capitan.app --nointeraction 制作完成重启一直按着Alt