标签: nswindowcontroller

NSWindowController澄清理解

我曾经多次在项目中使用过NSWindowController,感觉我对这个重要课程背后的概念有了非常粗略的把握.我想对这篇文章做的是澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步.这是我发现最有用的一目了然的概念,概述和最佳实践,并且通常缺少文档.这是我对NSWindowController的看法(问题以粗体点缀):

  • NSWindowController(NSWC)子类(概念上)存在于每个窗口笔尖下方,充当用户界面元素与它们控制/表示的模型对象之间的粘合剂.基本上,应用程序中的每个窗口都应该有自己的NSWC子类.
  • nib的文件所有者应始终是NSWC的子类.即使是MainMenu.xib应用程序也是如此?
  • NSWC window属性应始终链接到InterfaceBuilder中的NSWindow.
  • 你应该使用覆盖'init'方法,[super initWithWindowNibName:]这样当你引用[mycontroller window]它时会加载nib.对于MainMenu.xib窗口的NSWC,情况也是如此,即使这是在启动时打开的吗?
  • NSWC不应该做太多繁重的工作 - 它应该只是将消息传递给对象的实例,并在UI中呈现这些对象.
  • 它可以使用绑定来修改UI,或者作为表等的委托来修改UI,或者通过在观察到更改时主动更改UI元素,或者上述任何一个的组合(您使用哪一个似乎是一个问题)品味,各方利弊).
  • NSWC可以在必要时创建其他NSWC的实例(例如,打开一次性子窗口时).
  • 使用[mycontroller showWindow:nil]以显示前面的相关窗口.如果您希望窗口显示为工作表,请使用以下内容:

    NSWindowController* mycontroller = [[MyController alloc] init];
    [NSApp beginSheet: [mycontroller window]
       modalForWindow: [self window] 
        modalDelegate: self 
       didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:)
          contextInfo: nil];
    
    Run Code Online (Sandbox Code Playgroud)

didEndSelector:应该是父窗口的NSWC的方法,并且可以访问和释放"myController的"带[sheet windowController].- 要关闭窗口,请调用performClose:NSWC窗口的方法.

一些问题:

  • MainMenu窗口的NSWC是否也应该是应用程序代表,还是应该是不同的类?
  • 同样,主要的NSWC应该处理文件(拖放和打开),还是应该传递给应用代表,还是仅仅是品味问题?

请纠正我,如果这是不好的做法,或者是完全错误的.我希望澄清我对NSWindowController的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.

谢谢,劳里

cocoa nswindowcontroller cocoa-sheet

40
推荐指数
2
解决办法
9044
查看次数

在Storyboard中的NSWindowController/NSViewController"Presentation"设置

Presentation选项(在Attribute Inspector中)究竟在StoryBoard for Cocoa中做了什么.

在此输入图像描述

它提供了两个选项供您选择

PS用Google搜索标题时,结果与powerpoint演示文稿有关

macos cocoa storyboard nsviewcontroller nswindowcontroller

32
推荐指数
1
解决办法
2553
查看次数

在Swift和init(windowNibName)中对NSWindowController进行子类化

我正在尝试在Swift中启动一个基于Cocoa项目的新文档,并希望创建一个子类NSWindowController(如Apple的基于文档的应用程序指南中所推荐的).在ObjC中,您将创建一个NSWindowController子类的实例,该子类发送initWithWindowNibName:消息,相应地实现,调用超类方法.

在斯威夫特init(windowNibName)仅作为一种方便的初始化,类的指定初始化NSWindowController就是init(window)这显然想让我在一个窗口中通过.

我不能super.init(windowNibName)从我的子类调用,因为它不是指定的初始化器,所以我显然必须实现convenience init(windowNibName),而这又需要调用self.init(window).但是,如果我只有我的nib文件,如何访问nib文件的窗口以发送到该初始化程序?

cocoa initializer nswindowcontroller swift

31
推荐指数
3
解决办法
1万
查看次数

NSWindowController与NSViewController之间的区别

我来自iOS背景并开始学习Cocoa.在iOS上,除非我们有多个目标iPad,iPhone我们通常有一个窗口并使用管理屏幕UIViewControllers.每个新屏幕大部分时间都会映射到一个UIViewController.

然而,对于可可,这似乎是一个新的屏幕/窗口管理的地方NSWindow,它的子组件由管理NSViewController.因此,如果我有多个窗口应用程序,我应该NSWindowController为每个窗口分开.

这种方法是正确的还是我有误解?

cocoa cocoa-touch objective-c nswindowcontroller cocoa-design-patterns

27
推荐指数
2
解决办法
9668
查看次数

为什么我的表单不附加到它运行的窗口?

我有一个包含两个窗口的NIB,一个是启动时可见的应用程序主窗口,另一个是自定义工作表(因此在启动时不可见).当需要工作表时,我的控制器会调用:

[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];

它显示工作表窗口并启动模态会话,窗口有一个标准的Aqua标题栏,没有"连接"到主窗口,可以像常规窗口一样移动.不用说,这是不可取的:-).为什么表单窗口"弹出"它所运行的窗口,就像工作表通常以这种方式开始时一样?

我想知道我是否在控制器内部开始工作表的事实-awakeFromNib可能会产生影响,所以我将工作表移动到按钮的动作,我可以稍后触发.这并未改变行为.我没有想过要尝试的任何其他事情.我的目标是10.5 SDK,使用Xcode 3.1.

编辑:所以看起来我已经创建了一个模态对话框; 工作表和应用程序模式对话框都是使用该-beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:方法启动的.但是,如何指示我的窗口应该是工作表而不是模态对话框?

cocoa objective-c nswindow nswindowcontroller cocoa-sheet

25
推荐指数
2
解决办法
5695
查看次数

NSWindowController红色关闭按钮的事件

如何处理我点击NSWindowController的红色关闭按钮的事件?

询问的原因是我在新的NSWindowController窗口中播放视频,当用户点击红色关闭按钮时,音频继续播放,因此我想使用该事件关闭视频.

cocoa event-handling nswindowcontroller

18
推荐指数
1
解决办法
7857
查看次数

如何打开NSWindow并选择并关注窗口?

我正在尝试使用以下代码打开NSWindow:

NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"MainWindow"];
[window showWindow:nil];
Run Code Online (Sandbox Code Playgroud)

窗口打开正常但前一个窗口仍然是mainWindow并且是焦点.我尝试了以下代码来强制主窗口,它不起作用.该窗口仍有一个禁用的标题栏,不接受关键事件等.

[self.window makeKeyAndOrderFront:self];
[self.window makeMainWindow];
Run Code Online (Sandbox Code Playgroud)

我似乎能够让前一个窗口失去焦点的唯一方法是在调用showWindow后关闭窗口:[[NSApp mainWindow] close];

有任何想法吗?

macos cocoa objective-c nswindow nswindowcontroller

13
推荐指数
2
解决办法
1万
查看次数

如何在NSWindow关闭时收到通知

当NSWindow应该或将要关闭时,我该如何注意?我想要像windowWillClose这样的东西.不幸的是,NSWindowController没有像UIViewController那样方便的方法.那么这样做的最佳做法是什么?

谢谢
-f

cocoa appkit nswindow nswindowcontroller

13
推荐指数
1
解决办法
1万
查看次数

是否可以在不关注焦点的情况下将窗户拉到前面?

我正在为我的个人用途申请一个定期提醒我和/或需要输入文字的申请.因此,此弹出窗口具有NSTextField.

如果在我打字的过程中窗口弹出窗口,我的输入会转移到弹出窗口,这非常烦人!有没有办法阻止这个,目前我正在使用:

[NSApp activateIgnoringOtherApps:YES];
[hudWindow makeKeyAndOrderFront:nil];
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

[NSApp activateIgnoringOtherApps:YES];
[hudWindow orderFrontRegardless];
Run Code Online (Sandbox Code Playgroud)

还有其他办法吗?

macos cocoa objective-c nstextfield nswindowcontroller

11
推荐指数
1
解决办法
2933
查看次数

NSWindowController showWindow:nil什么都不做

喜欢在标题中,[myWindowController showWindow:nil]不起作用.以下是您可能需要了解的一些事实:

  • 我的窗口控制器: KRAuthenticationWindowController
  • 接口构建器文件: AuthenticationWindow.xib
  • 文件的所有者是 KRAuthenticationWindowController
  • window 插座连接到窗口
  • Window delegate已连接到File的所有者
  • 窗口Visible at launch是未选中的
  • 窗口Release when closed也是未选中的

我的代码如下:

// KRApplicationDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    NSLog(@"%s",__PRETTY_FUNCTION__);
    KRAuthenticationWindowController *authWindowController = [[KRAuthenticationWindowController alloc] init];
    [authWindowController showWindow:nil];
    [[authWindowController window] makeKeyAndOrderFront:nil];
}

// KRAuthenticationWindowController.m

- (id)init {
    self = [super initWithWindowNibName:@"AuthenticationWindow"];
    if(!self) return nil;
    NSLog(@"%s",__PRETTY_FUNCTION__);
    return self;
}

- (void)loadWindow {
    [super loadWindow];
    [self.window setBackgroundColor:[NSColor colorWithDeviceWhite:0.73 alpha:1]];
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

- (void)windowDidLoad {
    [super windowDidLoad];
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

- …
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c nswindow nswindowcontroller

10
推荐指数
1
解决办法
6257
查看次数