Programmatically creating NSView in Cocoa

I use programming for iOS, and I'm very used to it UIViewController. Now I am building an OSX application, and I have a few general questions about best practice.

In UIViewControllerI usually customize my views in a method -(void)viewDidLoad- I actually do not create a custom one UIViewfor UIViewControllerif I really don't need it, so I UIViewControlleradd a view to its own view, delete them, animate them, etc. - firstly, good practice?

And for my main question - what is the best practice in OSX? I like to create interfaces programmatically and just like that. If I, say, create a new custom window and want to control its presentation. What is the best way to do this and where is the best place to create a user interface?

Summary: How can I design custom views programmatically and establish optimal relationships between views and controllers in OSX? And is it considered good practice to use a view controller to create views in its view?

Yours faithfully

+5
source share
2 answers

NSViewController, loadView . -, nibName nibBundle NSViewController.

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

NSWindowController . windowDidLoad loadWindow. , loadWindow, , init. NSWindowController, , , , , 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. / , . , NSView NSViewController, .

-(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;
}
+6

- 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];
}
0

All Articles