关闭

MacOS 开发 - NSWindow 的创建和跳转

标签: NSWindowMacOS
2868人阅读 评论(1) 收藏 举报
分类:


一、经典用法

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

1、创建项目时,不勾选 Use Storyboards 选项;
创建出来的项目就包含 MainMenu.xib

创建 Window 和 WindowController

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 中。

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];//关闭当前窗口

}

返回

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];
}

结束方法:

- (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左上角的关闭按钮,而没有执行结束模态的方法。整个系统仍然处于模态,其他窗口无法正常工作。


参考资料:

mac app开发之:利用NSWindowController实现窗口跳转 -
http://blog.csdn.net/y_zhangpengwei/article/details/50817132

DIOS2012:http://www.jianshu.com/p/017f147d3b2d

0
0
查看评论

MacOS 开发 - NSWindow 自定义样式

设置标题 设置标题栏图标 设置窗口背景颜色 设置 Content Border 自定义titleBar 隐藏titlebar 设置为点击背景可以移动窗口 titleBar和下面的view合并到一起 系统提供的样式 常用的创建代码 1styleMask 按位表示的窗口风格参数 2backing窗口绘制...
  • lovechris00
  • lovechris00
  • 2017-09-12 12:39
  • 2975

NSWindow知多少?

如果你有其他的平台的經驗,來寫 Cocoa 應用程式,可能會發現 NSWindow 的行為跟你想得似乎不太一樣。 ※ NSWindow 屬於 View 雖然現在的 GUI 應用程式的架構大都遵循 MVC 的設計典範,但是不同的 Framework 之間,那個部分屬於 View,那個部分又屬於...
  • xxq_2011
  • xxq_2011
  • 2012-12-09 21:34
  • 3341

NSWindow 了解

Style Masks:指定窗口的标题栏和里面按钮的控制 1、NSBorderLessWindowMask  没有外部元件 比如关闭按钮,全屏,toolbar等 2、NSTitledWindowMask  是否有布置一个ti...
  • leer168
  • leer168
  • 2013-10-25 15:19
  • 7107

mac app开发之:利用NSWindowController实现窗口跳转

今天这篇博客主要讲述的是窗口之间的跳转,当然了相对于ios 页面之间跳转,还是觉得ios更可爱许多!一般在ios开发中我们都习惯于继承于系统的UIViewController自定义一个BaseViewController(名字是大家随便取的,根据个人爱好,请不要在意!),更方便于自己把公有的属性写在...
  • u012890071
  • u012890071
  • 2016-03-07 10:29
  • 7064

Mac开发,界面跳转

1、在appdelegate中创建Mac app的主窗口,并且在屏幕的中心显示 2、在MainWindowController控制器中, 其中,[self.window orderOut:nil];方法是把当前的视图层从屏幕列表中移除可是并没有销毁该控制器,就是让该界面在屏幕...
  • sinat_31177681
  • sinat_31177681
  • 2017-07-21 16:10
  • 447

macOS开发中NSWindow, NSWindowController, NSView, NSViewController的关系

macOS使用的Cocoa框架,的确没有iOS使用的Cocoa Touch那么智能好用。有些地方逻辑很奇怪,还有一些看似很正常的功能它却没有提供,还需要自定义。这里就有一个很头疼的问题,关于这四个类的问题,他们之间到底是什么关系,如果摆脱了storyboard如何用代码实现?今天就来简单介绍一下。 ...
  • fl2011sx
  • fl2011sx
  • 2017-06-14 23:32
  • 1888

MacOS 开发 - NSWindow 的创建和跳转

创建 Window 和 WindowController 跳转 返回经典用法 使用 xib 来创建 NSWindowController,并让后续的调用都继承自这个类。1、创建项目时,不勾选 Use Storyboards 选项; 创建出来的项目就包含 MainMenu.xib创建 Window...
  • lovechris00
  • lovechris00
  • 2017-09-10 15:26
  • 2868

NSWindowController 和 NSWindow 的关系

NSWindowController 和 NSWindow 的关系 [self.myWindowController showWindow:self]; #import "MainWindowController.h"@interface AppDelegate ()@pro...
  • wiseuc_jianghai
  • wiseuc_jianghai
  • 2017-05-03 16:13
  • 438

NSWindowController 显示新窗口 (1)

NSWindowController 显示新窗口 (1) STEP1 XCODE  New Application ST
  • u013317006
  • u013317006
  • 2014-06-03 11:09
  • 2211

Mac NSWindow窗口Size变化时的事件处理

1. 首先注册窗体大小变化时的事件处理的通知函数 [[NSNotificationCenter defaultCenter] addObserver:window selector:@selecto...
  • workhardupc100
  • workhardupc100
  • 2012-10-20 08:09
  • 3178
    博客专栏
    个人资料
    • 访问:210159次
    • 积分:3453
    • 等级:
    • 排名:第11457名
    • 原创:127篇
    • 转载:6篇
    • 译文:1篇
    • 评论:96条
    最新评论