zoukankan      html  css  js  c++  java
  • [MacOS NSAlert的使用]

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

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

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

    如图:
    c45b3dbe8e716d64796e5f2183a3afcb

    代码如下:

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

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

    如图:
    519a70025bac107f94ac548e08f2a26b
    代码如下:

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

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

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

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

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

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

    如图:
    Image

    代码如下:

    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.  
    15. }

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

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

    如图:
    Image
    代码如下:

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

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

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

  • 相关阅读:
    专利申请流程
    安装Fedora16与Windows7共存双系统
    rpm检查依赖性
    C++中的static函数和extern关键字
    asp.net 浏览服务器文件
    如何用批处理文件写:获取当前日期的前一天
    有一个无效 SelectedValue,因为它不在项目列表中。
    .net 4.0 检测到有潜在危险的 Request.Form 值。
    ckeditor 在C#中使用
    使用任务计划程序自动执行任务
  • 原文地址:https://www.cnblogs.com/rayshen/p/4229943.html
Copyright © 2011-2022 走看看