2015-02-17 2 views
1

Я использую XCode 6 на OS X 10.10 и имею раскадровку, содержащую окно с контроллером разделенного вида, как показано на следующем изображении.Настройка dataSource для NSTableView через сцены в раскадровке

My storyboard

Контроллер Разделить (выделен в изображении) является экземпляром MyViewController, который имеет следующий код:

MyViewController.h

#import <Cocoa/Cocoa.h> 

@interface MyViewController : NSSplitViewController <NSTableViewDataSource> 

@end 

MyViewController. м

#import "MyViewController.h" 

@implementation MyViewController 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 
    return 7; 
} 

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    return [NSString stringWithFormat:@"%ld", (long)row]; 
} 

@end 

Я хочу, чтобы в моей раскадровке был установлен контроллер dataSourceNSTableView, однако я не могу их подключить. Для этого есть причина?

ответ

0

В вашем NSSplitViewController -subclass viewDidLoad -method задает источник данных программным путем. Вам также необходимо реализовать класс контроллера дочернего представления (с выходом tableView, подключенным к элементу управления).

MySplitViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (NSSplitViewItem *item in self.splitViewItems) 
    { 
    NSViewController *controller = item.viewController; 
    if ([controller isKindOfClass:[MyChildController class]]) 
    { 
     MyChildController *myController = (MyChildController *)controller; 
     myController.tableView.dataSource = self; 
     [myController.tableView reloadData]; 
    } 
    } 
} 

Но сказать вам правду, я не люблю этот подход. Это лучше, когда методы источника данных в виде таблицы находятся в классе контроллера собственного вида.

Другой способ для этого. MyChildController.h файл:

@class MyChildViewController; 
@protocol MyChildControllerDelegate <NSObject> 

- (void)childController:(MyChildViewController *)controller didSelectRowAtIndex:(NSUInteger)index; 

@end 

@interface MyChildViewController : NSViewController <NSTableViewDataSource, NSTableViewDelegate> 

@property (nonatomic, weak) id<MyChildControllerDelegate> delegate; 

@property (nonatomic, retain) NSArray *items; 

@property (nonatomic, weak) IBOutlet NSTableView *tableView; 

@end 

Не забудьте реализовать все представление таблицы dataSource и delegate методы вам нужно. Файл MySplitViewController.m:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (NSSplitViewItem *item in self.splitViewItems) 
    { 
    NSViewController *controller = item.viewController; 
    if ([controller isKindOfClass:[MyChildController class]]) 
    { 
     MyChildController *myController = (MyChildController *)controller; 
     myController.delegate = self; 
     [myController setItems:_items]; 
    } 
    } 
} 
+0

Хм, не идеален, но он выполняет свою работу; Благодарю. Я надеялся, что это будет способ сделать это только с помощью раскадровки, поскольку Apple, похоже, думает, что все должны использовать раскадровки для всего этого в наши дни. – DanielGibbs

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