zoukankan      html  css  js  c++  java
  • swift之窗口

    NSPanel类型的窗口不能作为主窗口,只能作为键盘窗口。

    些常用的子类有 NSColorPanel(颜色选择)、 NSFontPanel(字体选择)、 NSSavePanel(保

    打开文件),这些子类化的窗口都只能作为键盘窗口,第5章将对它们的使用进行说明。

    21窗口界面的组成

    窗口界面由标题栏、内容视图和底部边框区组成。

    标题栏包括控制按钮和标题

    在 Window的属性面板中配置UI,

    Title Bar:去掉勾选后,窗口就没有顶部标题栏了。

    Close、 Minimize、 Resize:分别表示顶部左边3个控制按钮是否有效。

    ° Restorable:表示是否允许保存窗口的当前状态,下次运行时可以恢复之前的状态。例

    如,记住窗口的上一次的位置。

    2.2模态窗口

    当有多个窗口在屏幕上时,用户可以点击切换到任何一个窗口上。有些特殊场景需要限制

    用户必须处理完当前窗口的任务,完成任务后关闭它才能继续操作其他的窗口,这种窗口称为

    模态窗口( Modal window)。

    2.2.1模态窗口

    这种窗口比较霸道,当这个窗口启动后,只有它可以接收和响应用户操作,无法切换到其

    他窗口,其他窗口也不能接收和处理系统内部的各种事件。

    使用 NSApplication的 run For Window方法来创建模态窗口

      

    @IBAction func showModalWindow([_ sender: NSButton]){

        NSApplicaiton.shared.runModol(for: self.modalWindow)

        

    }

    使用 stopModal方法来结束模态。如果用户直接点击了窗口顶部最左侧的关闭按钮,虽然

    窗口关闭了,但是整个应用仍然处于模态,任何操作都无法得到响应。正确的做法是监听窗口

    关闭事件,增加结束模态的方法调用

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

        [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(self.windowClose(_:)) name:NSWindow.NSWindowWillCloseNotification object:nil];

    }

    运用示例https://www.jianshu.com/p/b0ef4ed1ed10

    由于用的是NSWindowController ,在.h中 遵守<NSWindowDelegate>代理

      - (IBAction)renameFile:(id)sender {
          NSString*name =_fileName.stringValue;
          BOOLbAllEscape =TRUE;
          int index =0;
          for(int i =0; i < [name length] ; i++) {
          NSString* temp = [name substringWithRange:NSMakeRange(i,1)];
          if([temp compare:@" "] !=0) {
              bAllEscape =FALSE;
                  index = i;
                    break;
                }
              }
              name = [name substringFromIndex:index];
          }
                [NSApp stopModal];//这里需要把modal关闭
                [self close];
              }
    

    代理方法

                - (BOOL)windowShouldClose:(id)sender{//代理方法
                        [NSApp stopModal];//关闭modal模式
                        returnYES;
                      }
    

    在控制器创建窗口时

          -(void)renameWindow:(NSString*)judge origionName:(NSString*)oldName {
                  self.renameWnd= [[RenameWnd alloc]initWithWindowNibName:@"RenameWnd"];
                  self.renameWnd.judge= judge;
                  [self.renameWnd loadWindow];
                  [self.renameWnd selectItemFileName:oldName];
                  [self.renameWnd showWindow:nil];
                  [NSApp runModalForWindow:self.renameWnd.window];//加上这句话,开启modal模式
              }
    

    现在已经做好模态窗口了

    链接:https://www.jianshu.com/p/b0ef4ed1ed10
     

    2017年09月10日 15:26:39 lovechris00 阅读数:5778更多

    所属专栏: macOS 开发

    版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/77922445

    MacOS 开发 - NSWindow 两种跳转

    https://blog.csdn.net/lovechris00/article/details/77922445

     准备工作

    准备工作

    思路:使用 xib 来创建 NSWindowController,并让后续的调用都继承自这个类。不使用 storyboard。

    1、创建项目时,不勾选 Use Storyboards 选项; 

    创建出来的项目就包含 MainMenu.xib。

    2、创建 MainWindow,继承自 NSWindow.

    3、创建 MainWindowController 继承自 NSWindowController,勾选 Also create XIB file for user interface。

    4、创建好3以后,在MainWindowController.xib中选中Window,将它的继承类改成我们前面2中自定义的BaseWindow。

    5、在AppDelegate.m文件类中删除 @property (weak) IBOutlet NSWindow *window;代码,

    6、并在MainMenu.xib中选中Window,删除该Window。

    7、在AppDelegate.h文件中引用MainWindowController.h文件创建其对象。注意写在 .h 而非 .m 里面,方便后续其他文件调用。

    @interface AppDelegate ()

    @property (strong) MainWindowController *mainWindowC;

    @end

    8、在AppDelegate.m中初始化 window,并让 window 显示和居中。

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

        [self initMainWindow];

    }

    - (void)initMainWindow{

        _mainWindowC = [[MainWindowController alloc]initWithWindowNibName:@"MainWindowController"];

        [[_mainWindowC window] center];

        [_mainWindowC.window orderFront:nil];

    }

    9、测试跳转方法,我们另外创建一个窗口 FirstWindowController 继承自NSWindowController ,勾选 xib,并将他的 window 继承自 BaseWindow。

    10、给 MainWindowController.xib 拖拽按钮,并将按钮方法连线到 MainWindowController.m 中。

    一、orderFront 跳转

    11、在 windowDidLoad 中初始化 firstWindow,并在按钮点击方法中编写跳转方法。

    - (void)windowDidLoad {

        [super windowDidLoad];

        self.contentViewController.view.wantsLayer = YES;

        self.contentViewController.view.layer.backgroundColor = [NSColor magentaColor].CGColor;

        self.firstWindowC = [[FirstWindowController alloc]initWithWindowNibName:@"FirstWindowController"];

    }

    - (IBAction)btn1OnClick:(id)sender {

        [self.firstWindowC.window orderFront:nil];//显示要跳出来的窗口

        [self.window orderOut:nil];//关闭当前窗口

    }

    说明:firstWindowC 需要作为属性被应用,如果在 btn1OnClick 里面初始化,虽然也可以跳转成功,但 firstWindowC 中的点击事件可能会失效。

    close 返回

    12、为了测试从 firstWindow 返回到 mainWindow,放置按钮到 FirstWindowController.xib,并给按钮拉线写方法:

    - (IBAction)btn1OnClick:(id)sender {

        AppDelegate *adelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];

        [self.window close];

        [[adelegate.mainWindowC window] makeKeyAndOrderFront:nil];

    }

    9、测试跳转方法,我们另外创建一个窗口 FirstWindowController 继承自NSWindowController ,勾选 xib,并将他的 window 继承自 BaseWindow。

    10、给 MainWindowController.xib 拖拽按钮,并将按钮方法连线到 MainWindowController.m 中。

    一、orderFront 跳转

    11、在 windowDidLoad 中初始化 firstWindow,并在按钮点击方法中编写跳转方法。

    - (void)windowDidLoad {

        [super windowDidLoad];

        self.contentViewController.view.wantsLayer = YES;

        self.contentViewController.view.layer.backgroundColor = [NSColor magentaColor].CGColor;

        self.firstWindowC = [[FirstWindowController alloc]initWithWindowNibName:@"FirstWindowController"];

    }

    - (IBAction)btn1OnClick:(id)sender {

        [self.firstWindowC.window orderFront:nil];//显示要跳出来的窗口

        [self.window orderOut:nil];//关闭当前窗口

    }

    说明:firstWindowC 需要作为属性被应用,如果在 btn1OnClick 里面初始化,虽然也可以跳转成功,但 firstWindowC 中的点击事件可能会失效。

    close 返回

    12、为了测试从 firstWindow 返回到 mainWindow,放置按钮到 FirstWindowController.xib,并给按钮拉线写方法:

    - (IBAction)btn1OnClick:(id)sender {

        AppDelegate *adelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];

        [self.window close];

        [[adelegate.mainWindowC window] makeKeyAndOrderFront:nil];

    }

    二、模态窗口及关闭方法

    有2种创建模态窗口的方法 

    可设置属性来区别两种弹出方式: 

    @property(nonatomic,assign)NSModalSession sessionCode;

    监听 NSWindowWillCloseNotification

    这两种方法的结束,都需要在调用的界面的 windowDidLoad 中添加监听:

        [[NSNotificationCenter defaultCenter] addObserver:self

                                                 selector:@selector(windowWillClose:)

                                                     name:NSWindowWillCloseNotification

                                                   object:nil];

    1、Modal windows

    特性:这种window比较霸道,当它启动后,此时只有这个window可以接收响应用户操作,无法切换到其他窗口操作,其他窗口也不能接收处理系统内部的各种事件。

    调用方法:

    -(IBAction)showModelWindowAction:(id)sender {

        _sessionCode = 0; //防止 session 模式弹出窗口后,sessionCode 没有更改。

        NSLog(@"_sessionCode2 : %d",_sessionCode);

        [[NSApplication sharedApplication] runModalForWindow:self.firstWindowC.window];

    }

    结束方法 stopModal :

    - (void)windowWillClose:(NSNotification *)notification {

        [[NSApplication sharedApplication] stopModal];

    }

    2、Modal sessions

    比起Modal windows,Modal sessions方式创建的window稍微温和一些,允许响应快捷键和系统菜单,比如字体颜色选择这些panel面板.

    启动Modal sessions 窗口

    - (IBAction)showSessionsWindow:(id)sender {

        _sessionCode = [[NSApplication sharedApplication] beginModalSessionForWindow:self.firstWindowC.window];

        NSLog(@"_sessionCode3 : %d",_sessionCode);

    }

    关闭窗口

    - (void)windowWillClose:(NSNotification *)notification {

        [[NSApplication sharedApplication] stopModal];

        NSLog(@"_sessionCode00 : %d",_sessionCode);

        if (_sessionCode != 0) {

            [[NSApplication sharedApplication] endModalSession:_sessionCode];

        }

    }

    注意任何一种模态窗口,都必须调用结束模态的方法stopModal去结束模态。 

    如果点击了window左上角的关闭按钮,而没有执行结束模态的方法。整个系统仍然处于模态,其他窗口无法正常工作。

  • 相关阅读:
    SQLserver 逗号隔开字段分开
    css实现鼠标移动到div,改变另一个div 样式
    selenium账号密码模拟登陆豆瓣
    HTML+CSS基础
    Nginx 报错 413 Request Entity Too Large 的解决方法
    Nginx 报错 504 Gateway Time-out 的解决方法
    Object定时器
    Object标签遮挡
    winRAR打包EXE
    jqGrid API
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10304245.html
Copyright © 2011-2022 走看看