我习惯于为iOS编程,我已经习惯了UIViewController
。现在,我正在创建一个OSX应用程序,我对最佳实践有一些一般性问题。
在UIViewController
我通常使用-(void)viewDidLoad
方法设置我的观点 - 我实际上并不为UIView
创建自定义UIViewController
,除非确实需要 - 所以UIViewController
将视图添加到自己的视图中,删除它们,为它们设置动画等等 - 首先,这是一种很好的做法吗?
对于我的主要问题 - OSX中的最佳做法是什么?我喜欢以编程方式创建接口,而只是喜欢这种方式。如果我,请说创建一个新的自定义窗口并想要管理它的视图。什么是最好的方法,以及在哪里最好地实例化用户界面?
总结:如何以编程方式构建自定义视图并在OSX中建立视图和控制器之间的最佳实践关系?使用视图控制器在视图中创建视图是否是一种良好的做法?
亲切的问候
答案 0 :(得分:7)
要在NSViewController中的代码中构造视图,请覆盖loadView并确保设置视图变量。 不要调用super的实现,因为它会尝试从NSViewController的nibName和nibBundle属性加载nib。
-(void)loadView
{
self.view = [[NSView alloc] init];
//Add buttons, fields, tables, whatnot
}
对于NSWindowController,程序非常相似。您应该在loadWindow实现结束时调用windowDidLoad。如果窗口为nil,窗口控制器也不会调用loadWindow,因此您需要在init期间调用它。 NSWindowController似乎假设您将在创建控制器之前在代码中创建窗口,除非从笔尖加载。
- (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.10之前,NSViewControllers不在OSX的第一个响应者链中。当响应者链中存在项目时,菜单将自动为您启用/禁用菜单项。您可能希望使用NSViewController属性创建自己的NSView子类,以允许它将控制器添加到响应程序链。
-(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];
}
最后,当我使用自定义视图时,我使用自定义的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;
}
答案 1 :(得分:0)
对于我的主要问题 - OSX中的最佳做法是什么?我喜欢 以编程方式创建接口,并且只是喜欢它。如果 我说,创建一个新的自定义窗口,并希望管理其视图。什么是 最好的方法,以及在哪里实例化用户界面 最好?
所有这些都在awakeFromNib
和init
完成。
以下代码创建了许多窗口并将它们存储在数组中。对于每个窗口,您可以添加视图。每个视图可能包含您希望拥有的所有控件。
self.myWindow= [[NSWindow alloc] initWithContentRect:NSMakeRect(100,100,300,300)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO];
[self.myWindowArray addObject:self.myWindow];
for (NSWindow *win in self.myWindowArray) {
[win makeKeyAndOrderFront:nil];
}