标签: nsviewcontroller

如何在Cocoa应用程序中切换视图?

所以我开始学习如何使用Cocoa.我想我已经得到了它,但我已经挂断了创建和切换视图.我正在改写我之前做过的练习游戏.我想要的只是一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图.

首先,我有主菜单(开始游戏,高分,退出).然后我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕).

我对此感到困惑的是如何设计它.我查找了NSViewController,认为它管理视图,但事实并非如此.它只通过加载它来管理一个视图.我不明白为什么我需要使用NSViewController.难道我不能只有一个包含多个NSView子类的窗口类并加载它们吗?我不确定我是否了解ViewController的用途.

我的Window类是否真的需要子类化NSWindowController?我试图按照Apple的ViewController示例的例子,它有一个窗口控制器类,它是NSWindowController的子类.我没有看到子类化的目的是什么.所有NSWindowController似乎都添加了- initWithPath:(NSString *)newPath但是当我可以编辑plist文件以在启动时打开窗口时,我无法看到它的用途.Apple的例子还有一个NSView变量和一个NSViewController变量.您是否只需要一个变量来存储当前视图?

先谢谢你们,我真的很困惑这是怎么回事.

macos cocoa objective-c nsviewcontroller

8
推荐指数
3
解决办法
8586
查看次数

使用nib创建自定义视图并在窗口中使用它

我一直在努力解决这个问题,我似乎无法自己解决这个问题.

情况就是这样:我想拥有一个基于Nib的自定义视图,它有自己的ViewController.然后我想将此视图添加到窗口中.因此,窗口应包含我的自定义视图.

所以我开始创建一个非常简单的例子:

  1. 在Xcode 4中,我创建了一个新的基于空白文档的Cocoa应用程序
  2. 我创建了一个新的Cocoa类,它应该从NSViewController(从而导致nib与.h和.m文件一起创建.创建的.h,.m和.xib文件的名称FaceViewController用于测试目的,它应该只显示现在的文字.
  3. NSViewController.xib在InterfaceBuilder中打开并添加一个多行文本组件并将其放在自定义视图中,该视图已在xib文件中.我让文本跨越整个视图.
  4. MyDocument.xib我还添加一个Custom View占位符,应该用我的自定义FaceView替换.

从这个起点开始,我试图在我的MyDocument.xib失败中包含创建的View + ViewController 以及应该显示我的文本的区域仍然是空的(就像底层窗口的背景一样).

所以我的问题确实是我需要做的,所以我的FaceView被加载到我放置的自定义视图中MyDocument.xib.以下是一些我不清楚的事情:

  • 自定义视图扩展,NSView因此我想将其更改为我的FaceView但视图不作为类存在但在xib中的InterfaceBuilder中定义,我是否需要将此设置为除此之外的其他内容NSView
  • 我是否必须分配,初始化FaceViewController代码或是否足以将其拖入我的两个.xibs中的任何一个?
  • 我可以使用InterfaceBuilder来放置我的FaceView,还是必须以编程方式执行此操作?

我真的认为创建一个这样的自定义视图将是一块蛋糕,但到目前为止,结果恰恰相反,所以任何帮助都将非常感激.

xcode cocoa interface-builder nib nsviewcontroller

8
推荐指数
1
解决办法
6274
查看次数

设置使用initWithNibName初始化的NSViewController的最佳方法:bundle:?

我有一个NSViewController的子类,它从一个nib加载它的视图(使用initWithNibName:bundle:它是该nib的文件所有者).

我需要在加载nib之后进行一些初始化,并且我希望我的代码最兼容:

  • 在ios中:有viewDidLoad方法可以做到这一点
  • 在osx中​​:在雪豹中,没有像viewDidLoad这样的方法,但是在文件的nib所有者上也调用了awakeFromNib

所以我的问题是:

  1. awakeFromNib是否还调用了Lion中文件的nib所有者?
  2. 如果我使用awakeFromNib,我是否需要调用[super awakeFromNib]?(NSViewController是否实现了awakeFromNib?)
  3. 如果答案1为是,这是一个很好的解决方案吗?:
- (void)initAfterNibLoaded {
   ...
}

- (void)viewDidLoad {
   // Code for ios
   [self initAfterNibLoaded];
}

- (void)awakeFromNib {
   // Code for osx

   // Not sure if necessary
   [super awakeFromNib];

   [self initAfterNibLoaded];
}
Run Code Online (Sandbox Code Playgroud)

如果答案1为否,这是一个很好的解决方案吗?:

- (void)viewDidLoad {
   // Initialize after nib loaded
}

#ifndef TARGET_OS_IPHONE
- (void)loadView {
   // Call parent method
   [super loadView];

   // Simulate viewDidLoad method
   [self viewDidLoad];
}
#endif
Run Code Online (Sandbox Code Playgroud)

谢谢

macos initialization nsviewcontroller ios awakefromnib

8
推荐指数
1
解决办法
2740
查看次数

NSViewController上的validateMenuItem

是否可以使validateMenuItem与NSViewControllers一起使用?文档说NSViewController是NSResponder的子类,所以我认为它会参与响应者链,但我从来没有能够让它工作.我可以使用NSView,没问题.

我的特定用例是MainMenu.xib中的一个菜单项,它连接到First Responder.我的视图控制器子类中的选择器显示在MainMenu的第一响应者弹出的选择器列表中,所以我认为它可以工作,但事实并非如此.我的子类的validateMenuItem方法永远不会被调用.(调用app委托中的那个,但不是连接到First Responder的项目.)

macos cocoa nsviewcontroller nsmenuitem nsresponder

8
推荐指数
0
解决办法
536
查看次数

什么是CGSUpdateManager,为什么抱怨?

我正在使用我的用户界面,试图通过一大堆嵌套的NSSplitViewControllers,NSTabViewControllers等来导航我的数据.

在某些时候,我得到这些错误警告.我不知道他们来自哪里,甚至在哪里看.该应用程序似乎工作正常.

什么是CGSUpdateManager,为什么抱怨?

void CGSUpdateManager::log() const: conn 0xdbbb token 0x2ffffffffffdc78 Backtrace (at 5543.57):
void CGSUpdateManager::log() const:  0   CoreGraphics                        0x00007fff85db9215 CGSBacktraceCreate + 59
void CGSUpdateManager::log() const:  1   CoreGraphics                        0x00007fff85dd8688 _ZN16CGSUpdateManager14disable_updateEv + 84
void CGSUpdateManager::log() const:  2   AppKit                              0x00007fff897f3de5 -[NSWindow disableScreenUpdatesUntilFlush] + 127
void CGSUpdateManager::log() const:  3   AppKit                              0x00007fff897b3250 -[NSView _gainedLayerTreeHostAncestor] + 385
void CGSUpdateManager::log() const:  4   AppKit                              0x00007fff897b30ae -[NSView _recursiveGainedLayerTreeHostAncestor] + 27
void CGSUpdateManager::log() const:  5   AppKit                              0x00007fff897b767a -[NSScroller _recursiveGainedLayerTreeHostAncestor] + 103
void CGSUpdateManager::log() const:  6   AppKit                              0x00007fff89a1ea56 -[NSScroller _setSurfaceBacked:] + …
Run Code Online (Sandbox Code Playgroud)

cocoa nsviewcontroller swift

8
推荐指数
1
解决办法
4139
查看次数

不可调整大小的窗口swift

我有一个NSViewController名字Hardness,我不需要让用户调整它.当然,我可以在每次用户尝试时重新调整它,但有没有办法让用户打开一个窗口全屏,或者拉伸窗口?

macos nswindow nsviewcontroller window-resize swift

8
推荐指数
3
解决办法
5784
查看次数

正确使用NSViewController表示的对象

我有一个NSViewController管理NSTableView,发现NSViewController有一个representedObject特性,但是它不是一个IBOutlet,我不能约束dataSourceNSTableViewrepresentedObject的财产NSViewController在Interface Builder。表示对象属性应如何使用?有适当使用的例子吗?

cocoa nsviewcontroller

7
推荐指数
1
解决办法
4593
查看次数

Cocoa听键盘命令+ up事件

我正在开发一个macOS应用程序,我想处理一个本地热键事件(命令+向上箭头键)NSViewController.

以下是我使用Swift的方法:

override func keyDown(with event: NSEvent) {

    let modifierkeys = event.modifierFlags.intersection(.deviceIndependentFlagsMask);
    let hasCommand = modifierkeys == .command;

    switch Int(event.keyCode) {
    case kVK_UpArrow where hasCommand:
        print("command up");
        break;
    case kVK_ANSI_B where hasCommand:
        print("command B");
        break;
    default:
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在视图中构建并按下命令+向上时,控制台不显示任何内容.但是当我按下命令+ B时,"命令B"被注销.

那么为什么这不适用于Command +?我该怎么做到这一点?

cocoa nsevent nsviewcontroller swift

7
推荐指数
1
解决办法
735
查看次数

如何让WKWebView在swift和macOS App中工作

在此之前,由于重复而被击落,事实并非如此.几乎WKWebView上的每个问题都是关于iOS应用程序中的WKWebView,而不是macOS应用程序,区别仅在于实现的UIViewController接口而不是macOS中的NSViewController接口.

Apple的文档中的示例代码以及可在线找到的Controller代码不起作用.尽管如此,它编译时没有问题,webview保持不活动状态.

有什么东西我没看到,或者这是WKWebView中的错误?
我甚至从教程中复制了一些代码,显示了如何为iOS做这个,只是将UIViewController更改为NSViewController(因为这是唯一的区别),但它没有用.

ViewController.swift中的以下代码不起作用.它也不起作用
class ViewController: NSViewController, WKUIDelegate

import Cocoa;
import WebKit;
class ViewController: NSViewController {
    @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let url=URL(string: "http://safetec-cam.biz/images/webcam_extern/bad-nauheim_bahnhof_west.jpg");
        webView.load(URLRequest(url: url!));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果用UIViewController 从https://developer.apple.com/documentation/webkit/wkwebview交换NSViewController 图像,这样做也行不通

macos xcode nsviewcontroller swift wkwebview

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

如何使嵌入式视图控制器成为响应者链的一部分?

我正在使用故事板开发 Mac 应用程序。我有一个窗口,它显示一个NSViewController作为其内容的窗口,其中包含一个嵌入NSSplitViewController.

在此处输入图片说明

预期的行为是作为NSSplitViewController响应者链的一部分,这样触发toggleSidebar第一响应者操作的菜单项实际上会折叠NSSplitViewController标记为侧边栏的项。

但是,这根本不会发生并且菜单项保持禁用状态。所以我的问题是,我如何才能NSSplitViewController成为响应者链的一部分?

macos cocoa first-responder nsviewcontroller swift

7
推荐指数
1
解决办法
967
查看次数