Eux
Eux

Reputation: 512

How to manage windows in cocoa

I know the question is a bit generic but I guess my issue is generic as well. I'm developing a small application in my free time and I decided to do it with Cocoa. It's nice, many things works almost automagically, but sometimes it's quite hard to understand how the framework works.

Lately I'm facing a new problem. I want to manage all the windows of the application from a single class, a front controller basically. I have a main menu and an "Import data" function. When I click it I want to show another window containing a table and call a method for updating the data. The problem is that this method is inside the class that implements the NSTableViewDataSource protocol.

How can I have a reference to that class? And more important, which should be the right way to do it? Should I extend the NSWindow class so that I can receive an Instance of NSWindow that can control the window containing the table (and then call the method)?

I may find several ways to overcome this issue, but I'd like to know which one is the best practice to use with cocoa.

PS: I know that there are tons of documentations files, but I need 2 lives to do everything I'd like to, so I thought I may use some help asking here :)

Upvotes: 1

Views: 516

Answers (1)

paulmelnikow
paulmelnikow

Reputation: 17208

The problem is that this method is inside the class that implements the NSTableViewDataSource protocol.

How can I have a reference to that class?

These two sentences don't make sense, but I think I understand what you're getting at.

Instead of subclassing NSWindow, put your import window's controlling logic – including your NSTableViewDataSource methods – into a controller class. If the controller corresponds to a window, you can subclass NSWindowController, though you don't have to.

You can implement -importData: as an IBAction in your application delegate, then connect the menu item's selector to importData: on First Responder. That method should instantiate the import window controller and load the window from a nib.

In your import window controller's -awakeFromNib or -windowDidLoad method, call the method which updates the data.

Added:

Here's the pattern I'd suggest using in your app delegate:

@property (retain) ImportWindowController *importWC;

- (IBAction) showImportWindow:(id) sender {
    if (!self.importWC)
        self.importWC =
        [[ImportWindowController alloc] initWithWindowNibName:@"ImportWindow"];
    [self.importWC refreshData];
    [self.importWC.window makeKeyAndOrderFront:sender];
}

Upvotes: 2

Related Questions