9
votes

I have an os x app that uses core data.

I have 3 .xib files in my app, those are:

1. MainMenu.xib
2. MasterTableViewController.xib 
3. DetailViewController.xib  

When started , app displays a view that has NSTableView with couple of records in it.

I name that view MasterTableViewController

I want when user double click on the row, to hide the "master" view and to display my "detail" view. I named that view DetailViewController.

When double clicked on the row in the NSTableView in the "master" view,nothing happen, "master" view remains visible. What I want is "master" view to dissapear, and "detail" view to appear.

Here is the code that I have right now, and more explanations follows:

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;


    @property (nonatomic,strong) NSViewController *mainAppViewController;
    @property (weak) IBOutlet NSView *mainAppView;
    - (void)changeViewController:(NSInteger)tag;

    @property (weak) IBOutlet NSTableView *websitesTableView;
    - (void)tableViewDoubleClick:(id)nid;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "MasterTableViewController.h"
#import "DetailViewController.h"
@interface AppDelegate ()

    @property (weak) IBOutlet NSWindow *window;
    - (IBAction)saveAction:(id)sender;

@end

@implementation AppDelegate

    NSString *const masterTable = @"MasterTableViewController";
    NSString *const detail = @"DetailViewController";


    -(void)awakeFromNib {   
        [_websitesTableView setTarget:self];
        [_websitesTableView setDoubleAction:@selector(tableViewDoubleClick:)];
    }

    - (void)tableViewDoubleClick:(id)nid {
        NSInteger rowNumber = [_websitesTableView clickedRow];
        NSTableColumn *column = [_websitesTableView tableColumnWithIdentifier:@"websiteUrl"];
        NSCell *cell = [column dataCellForRow:rowNumber];

        NSInteger tag = 2;
        [self changeViewController:tag];
    }

    - (void)changeViewController:(NSInteger)tag {

        [[_mainAppViewController view]removeFromSuperview];  
        switch (tag) {
            case 1:
                self.mainAppViewController = [[MasterTableViewController alloc]initWithNibName:masterTable bundle:nil];
            break;

            case 2:
                self.mainAppViewController = [[DetailViewController alloc]initWithNibName:detail bundle:nil];
            break;

         }

    [_mainAppView addSubview:[_mainAppViewController view]];
    [[_mainAppViewController view] setFrame:[_mainAppView bounds]];
    [[_mainAppViewController view] setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    }


    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        // automatically run the master table view controller
        NSInteger tag = 1;
        [self changeViewController:tag];
    }

Now, some of you may wondering, where is the rest of the code. I have ommited the boiler plate code for the core data below in the AppDelegage.m, since it is unchanged. I used binding to make my NSTableView to work and to display my records, so MasterTableViewController.h and .m files are empty, and same is true for the DetailViewController.h and .m file.

Important note - What i can't understand here: If I change the tag in 2 in the applicationDidFinishLaunching method, detail view is displayed normally, but if i switch it back on 1, and then double click on the row, "master" view (with the NSTableView) remains visible, and nothing happen (views are not swapped)

Anyone can help me to find out what is wrong with my code?

Regards, John

1
Have you tried to debug? And it can go into tableViewDoubleClick? - tuledev
Yes, it does go there, and I can get the number of row that has been clicked and it's value. - user2417624
To what is the websitesTableView outlet connected and how? Presumably, it's connected in the MainMenu.xib, but I thought the table view that's being double-clicked is not part of MainMenu.xib; I thought it's in MasterTableViewController.xib. - Ken Thomases
websitesTableView is in the the MasterTableViewController.xib and is connected to the AppDelegate.h - user2417624
How can that be? There's should be only one AppDelegate instance and that's the one in MainMenu.xib. So, it wouldn't be in MasterTableViewController.xib to connect its outlet to the table view. I suspect you have instantiated a second instance in MasterTableViewController.xib without realizing it. That would explain the behavior you're seeing. One instance has the table view outlet connected, the other has the outlet to the window and its view's connected (i.e. mainAppView). - Ken Thomases

1 Answers

3
votes

You apparently had a second instance of your AppDelegate class instantiated in the MasterTableViewController.xib file. There should be only one AppDelegate instance and that's the one in MainMenu.xib. So, it shouldn't be in MasterTableViewController.xib.

One of the instances was receiving the double-click action method from the table, but the other one was the one with the outlet to the main window.

You need(ed) to get rid of the second instance and find another way to access the app delegate from the MasterTableViewController.