2015-08-13 4 views
9

У меня есть приложение os x, которое использует основные данные.Двойной щелчок по строке в NSTableView не отображает новый вид

У меня есть 3 .xib файлы в моем приложении, те:

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

При запуске приложение отображает вид, который имеет NSTableView с парой записей в нем.

имя я, что посмотреть MasterTableViewController

Я хочу, когда пользователь дважды щелкните на строке, чтобы скрыть «мастер» вид и отображать мой «деталь» вид. Я назвал это view DetailViewController.

При двойном щелчке по строке в NSTableView в «главном» представлении ничего не происходит, «ведущий» вид остается видимым. То, что я хочу, - это «главное» представление о исчезновении, а также «подробное» представление.

Вот код, который я прямо сейчас, и больше объяснений следует:

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

Теперь, некоторые вы можете подумать, где находится остальная часть кода. Я пропустил код плиты котла для основных данных ниже в AppDelegage.m, так как он не изменился. Я использовал привязку, чтобы заставить NSTableView работать и отображать мои записи, поэтому файлы MasterTableViewController.h и .m пустые, и то же самое верно для файлов DetailViewController.h и .m.

Важное примечание - Что я не могу понять здесь: Если изменить тег в 2 в методе applicationDidFinishLaunching, детальный вид отображается нормально, но если я переключить его обратно на 1, а затем дважды щелкните на строка, «главный» вид (с помощью NSTableView) остается видимой, и ничего не происходит (просмотры не меняются местами)

Кто-нибудь может помочь мне узнать, что не так с моим кодом?

С уважением, Джон

+0

Вы пытались отладить? И он может пойти в tableViewDoubleClick? – anhtu

+0

Да, он идет туда, и я могу получить количество строк, которые были нажаты, и это значение. – user2417624

+0

К чему подключается выход 'websiteTableView' и как? Предположительно, он подключен в MainMenu.xib, но я подумал, что двойное нажатие на таблицу не является частью MainMenu.xib; Я думал, что это в MasterTableViewController.xib. –

ответ

3

Вы, видимо, был второй экземпляр вашего AppDelegate класса реализованным в файле MasterTableViewController.xib. Там должен быть только один экземпляр AppDelegate, и это тот, который находится в MainMenu.xib. Таким образом, это не должно быть в MasterTableViewController.xib.

Один из экземпляров получал метод двойного щелчка из таблицы, а другой - тот, у которого выход в главное окно.

Вам необходимо (ed) избавиться от второго экземпляра и найти другой способ доступа к делегату приложения из MasterTableViewController.

Смежные вопросы