gpt4 book ai didi

ios - 在 Cocoa 中以编程方式创建 NSView

转载 作者:可可西里 更新时间:2023-11-01 03:49:36 26 4
gpt4 key购买 nike

我习惯于为 iOS 编程,并且我已经非常习惯于 UIViewController。现在,我正在创建一个 OSX 应用程序,我有一些关于最佳实践的一般性问题。

UIViewController 中,我通常在 -(void)viewDidLoad 方法中设置我的 View - 我实际上并没有创建自定义 UIView对于 UIViewController 除非它真的需要 - 所以 UIViewController 将 View 添加到它自己的 View ,删除它们,为它们设置动画等等 - 首先,这是好的做法吗?

对于我的主要问题 - OSX 中的最佳实践是什么?我喜欢以编程方式创建界面,并且更喜欢这种方式。如果我说创建一个新的自定义窗口并想要管理它的 View 。最好的方法是什么?我在哪里最好地实例化用户界面?

总结:如何以编程方式构建自定义 View 并在 OSX 中建立 View 和 Controller 之间的最佳实践关系?使用 View Controller 在其 View 中创建 View 是否被认为是好的做法?

亲切的问候

最佳答案

要在 NSViewController 的代码中构建 View ,请覆盖 loadView 并确保设置 View 变量。 不要调用 super 的实现,因为它会尝试从 NSViewController 的 nibName 和 nibBundle 属性加载 nib。

-(void)loadView
{
self.view = [[NSView alloc] init];
//Add buttons, fields, tables, whatnot
}

对于 NSWindowController,过程非常相似。您应该在 loadWindow 的实现结束时调用 windowDidLoad。此外,如果窗口为 nil,则窗口 Controller 不会调用 loadWindow,因此您需要在初始化期间调用它。 NSWindowController 似乎假设您将在创建 Controller 之前在代码中创建窗口,除非从 nib 加载。

- (id)initWithDocument:(FFDocument *)document
url:(NSURL *)url
{
self = [super init];
if (self)
{
[self loadWindow];
}

return self;
}
- (void)loadWindow
{
self.window = [[NSWindow alloc] init];
//Content view comes from a view controller
MyViewController * viewController = [[MyViewController alloc] init];
[self.window setContentView:viewController.view];
//Your viewController variable is about to go out of scope at this point. You may want to create a property in the WindowController to store it.
[self windowDidLoad];
}

一些可选的幻想化(10.9 及更早版本)

在 10.10 之前,NSViewControllers 不在 OSX 的第一响应者链中。当响应链中存在项目时,菜单将自动为您启用/禁用菜单项。您可能希望使用 NSViewController 属性创建自己的 NSView 子类,以允许它将 Controller 添加到响应者链。

-(void)setViewController:(NSViewController *)newController
{
if (viewController)
{
NSResponder *controllerNextResponder = [viewController nextResponder];
[super setNextResponder:controllerNextResponder];
[viewController setNextResponder:nil];
}

viewController = newController;

if (newController)
{
NSResponder *ownNextResponder = [self nextResponder];
[super setNextResponder: viewController];
[viewController setNextResponder:ownNextResponder];
}
}

- (void)setNextResponder:(NSResponder *)newNextResponder
{
if (viewController)
{
[viewController setNextResponder:newNextResponder];
return;
}

[super setNextResponder:newNextResponder];
}

最后,当我使用自定义 View 时,我使用自定义 NSViewController 覆盖 setView 来设置 viewController 属性。

-(void)setView:(NSView *)view
{
[super setView:view];
SEL setViewController = @selector(setViewController:);
if ([view respondsToSelector:setViewController])
{
[view performSelector:setViewController withObject:self];
}
}

- (BOOL)acceptsFirstResponder
{
return YES;
}

关于ios - 在 Cocoa 中以编程方式创建 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14540331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com