Dav*_*vid 6 macos cocoa objective-c ios
我习惯于为iOS编程,而且我已经习惯了UIViewController.现在,我正在创建一个OSX应用程序,我对最佳实践有一些一般性问题.
在UIViewController我通常在-(void)viewDidLoad方法中设置我的视图- 我实际上并没有UIView为UIViewController它创建一个自定义,除非它真的需要 - 所以UIViewController添加视图到它自己的视图,删除它们,动画它们等等 - 首先,这是一个好习惯?
对于我的主要问题 - OSX中的最佳实践是什么?我喜欢以编程方式创建接口,而只是喜欢这种方式.如果我,请说创建一个新的自定义窗口并想要管理它的视图.最好的方法是什么,以及在哪里最好地实例化用户界面?
简介:如何以编程方式构建自定义视图并在OSX中建立视图和控制器之间的最佳实践关系?使用视图控制器在其视图中创建视图是否被视为良好做法?
亲切的问候
要在NSViewController中的代码中构造视图,请覆盖loadView并确保设置视图变量.不要调用super的实现,因为它将尝试从NSViewController的nibName和nibBundle属性加载nib.
-(void)loadView
{
self.view = [[NSView alloc] init];
//Add buttons, fields, tables, whatnot
}
Run Code Online (Sandbox Code Playgroud)
对于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];
}
Run Code Online (Sandbox Code Playgroud)
在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];
}
Run Code Online (Sandbox Code Playgroud)
最后,当我使用自定义视图时,我使用自定义的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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5068 次 |
| 最近记录: |