2015-08-13 11 views
9

Ho un'app os x che utilizza i dati principali.Fare doppio clic sulla riga in NSTableView non visualizza la nuova vista

Ho 3 file .xib nella mia app, questi sono:

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

Quando ha iniziato, applicazione visualizza una vista che ha NSTableView con paio di record in esso.

nome che che vista MasterTableViewController

voglio quando l'utente doppio click sulla riga, per nascondere la vista "master" e per visualizzare il "dettaglio" vista. Ho chiamato quella vista DetailViewController.

Quando si fa doppio clic sulla riga in NSTableView nella vista "master", non accade nulla, la vista "master" rimane visibile. Quello che voglio è la vista "master" per scomparire, e la vista "detail" per apparire.

Ecco il codice che ho in questo momento, e più spiegazioni segue:

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

Ora, alcuni di voi potrebbe chiedervi, dov'è il resto del codice. Ho omesso il codice della piastra della caldaia per i dati di base qui sotto in AppDelegage.m, poiché è invariato. Ho usato il binding per far funzionare il mio NSTableView e per visualizzare i miei record, quindi i file MasterTableViewController.h e .m sono vuoti, e lo stesso vale per il file DetailViewController.h e .m.

Nota importante - quello che non riesco a capire qui: Se cambio il tag in 2 nel metodo applicationDidFinishLaunching, vista di dettaglio è visualizzato normalmente, ma se passo indietro sopra 1, e quindi fare doppio clic sul riga, la vista "master" (con NSTableView) rimane visibile e non accade nulla (le viste non vengono scambiate)

Chiunque può aiutarmi a scoprire cosa c'è di sbagliato nel mio codice?

saluti, John

+0

Hai provato a eseguire il debug? E può andare in tableViewDoubleClick? – anhtu

+0

Sì, va lì, e posso ottenere il numero di riga che è stato cliccato e il suo valore. – user2417624

+0

A cosa è connesso l'outlet 'websitesTableView' e come? Presumibilmente, è collegato a MainMenu.xib, ma ho pensato che la vista tabella che viene cliccata due volte non faccia parte di MainMenu.xib; Ho pensato che fosse in MasterTableViewController.xib. –

risposta

3

È a quanto pare ha avuto una seconda istanza della vostra classe AppDelegate un'istanza nel file MasterTableViewController.xib. Dovrebbe esserci solo un'istanza AppDelegate e quella è in MainMenu.xib. Quindi, non dovrebbe essere in MasterTableViewController.xib.

Una delle istanze stava ricevendo il metodo di azione doppio clic dalla tabella, ma l'altra era quella con l'uscita della finestra principale.

È necessario (ed) eliminare la seconda istanza e trovare un altro modo per accedere al delegato dell'app da MasterTableViewController.

Problemi correlati