Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Double click on row in NSTableView doesn't display the new view

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

like image 722
user2417624 Avatar asked Aug 13 '15 10:08

user2417624


1 Answers

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.

like image 106
Ken Thomases Avatar answered Nov 10 '22 00:11

Ken Thomases