所以我开始学习如何使用Cocoa.我想我已经得到了它,但我已经挂断了创建和切换视图.我正在改写我之前做过的练习游戏.我想要的只是一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图.
首先,我有主菜单(开始游戏,高分,退出).然后我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕).
我对此感到困惑的是如何设计它.我查找了NSViewController,认为它管理视图,但事实并非如此.它只通过加载它来管理一个视图.我不明白为什么我需要使用NSViewController.难道我不能只有一个包含多个NSView子类的窗口类并加载它们吗?我不确定我是否了解ViewController的用途.
我的Window类是否真的需要子类化NSWindowController?我试图按照Apple的ViewController示例的例子,它有一个窗口控制器类,它是NSWindowController的子类.我没有看到子类化的目的是什么.所有NSWindowController似乎都添加了- initWithPath:(NSString *)newPath但是当我可以编辑plist文件以在启动时打开窗口时,我无法看到它的用途.Apple的例子还有一个NSView变量和一个NSViewController变量.您是否只需要一个变量来存储当前视图?
先谢谢你们,我真的很困惑这是怎么回事.
我一直在努力解决这个问题,我似乎无法自己解决这个问题.
情况就是这样:我想拥有一个基于Nib的自定义视图,它有自己的ViewController.然后我想将此视图添加到窗口中.因此,窗口应包含我的自定义视图.
所以我开始创建一个非常简单的例子:
NSViewController(从而导致nib与.h和.m文件一起创建.创建的.h,.m和.xib文件的名称FaceViewController用于测试目的,它应该只显示现在的文字.NSViewController.xib在InterfaceBuilder中打开并添加一个多行文本组件并将其放在自定义视图中,该视图已在xib文件中.我让文本跨越整个视图.MyDocument.xib我还添加一个Custom View占位符,应该用我的自定义FaceView替换.从这个起点开始,我试图在我的MyDocument.xib失败中包含创建的View + ViewController 以及应该显示我的文本的区域仍然是空的(就像底层窗口的背景一样).
所以我的问题确实是我需要做的,所以我的FaceView被加载到我放置的自定义视图中MyDocument.xib.以下是一些我不清楚的事情:
NSView因此我想将其更改为我的FaceView但视图不作为类存在但在xib中的InterfaceBuilder中定义,我是否需要将此设置为除此之外的其他内容NSView?FaceViewController代码或是否足以将其拖入我的两个.xibs中的任何一个?我真的认为创建一个这样的自定义视图将是一块蛋糕,但到目前为止,结果恰恰相反,所以任何帮助都将非常感激.
我有一个NSViewController的子类,它从一个nib加载它的视图(使用initWithNibName:bundle:它是该nib的文件所有者).
我需要在加载nib之后进行一些初始化,并且我希望我的代码最兼容:
所以我的问题是:
Run Code Online (Sandbox Code Playgroud)- (void)initAfterNibLoaded { ... } - (void)viewDidLoad { // Code for ios [self initAfterNibLoaded]; } - (void)awakeFromNib { // Code for osx // Not sure if necessary [super awakeFromNib]; [self initAfterNibLoaded]; }
如果答案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)
谢谢
是否可以使validateMenuItem与NSViewControllers一起使用?文档说NSViewController是NSResponder的子类,所以我认为它会参与响应者链,但我从来没有能够让它工作.我可以使用NSView,没问题.
我的特定用例是MainMenu.xib中的一个菜单项,它连接到First Responder.我的视图控制器子类中的选择器显示在MainMenu的第一响应者弹出的选择器列表中,所以我认为它可以工作,但事实并非如此.我的子类的validateMenuItem方法永远不会被调用.(调用app委托中的那个,但不是连接到First Responder的项目.)
我正在使用我的用户界面,试图通过一大堆嵌套的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) 我有一个NSViewController名字Hardness,我不需要让用户调整它.当然,我可以在每次用户尝试时重新调整它,但有没有办法让用户打开一个窗口全屏,或者拉伸窗口?
我有一个NSViewController管理NSTableView,发现NSViewController有一个representedObject特性,但是它不是一个IBOutlet,我不能约束dataSource的NSTableView到representedObject的财产NSViewController在Interface Builder。表示对象属性应如何使用?有适当使用的例子吗?
我正在开发一个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 +?我该怎么做到这一点?
在此之前,由于重复而被击落,事实并非如此.几乎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 图像,这样做也行不通
我正在使用故事板开发 Mac 应用程序。我有一个窗口,它显示一个NSViewController作为其内容的窗口,其中包含一个嵌入NSSplitViewController.
预期的行为是作为NSSplitViewController响应者链的一部分,这样触发toggleSidebar第一响应者操作的菜单项实际上会折叠NSSplitViewController标记为侧边栏的项。
但是,这根本不会发生并且菜单项保持禁用状态。所以我的问题是,我如何才能NSSplitViewController成为响应者链的一部分?
nsviewcontroller ×10
cocoa ×7
macos ×6
swift ×5
xcode ×2
awakefromnib ×1
ios ×1
nib ×1
nsevent ×1
nsmenuitem ×1
nsresponder ×1
nswindow ×1
objective-c ×1
wkwebview ×1