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
Hai provato a eseguire il debug? E può andare in tableViewDoubleClick? – anhtu
Sì, va lì, e posso ottenere il numero di riga che è stato cliccato e il suo valore. – user2417624
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. –