在故事板中跨场景设置 NSTableView 的数据源
Setting dataSource for NSTableView across scenes in a storyboard
我在 OS X 10.10 上使用 XCode 6,并且有一个包含 window 和拆分视图控制器的故事板,如下图所示。
拆分视图控制器(在图像中突出显示)是 MyViewController
的一个实例,它具有以下代码:
MyViewController.h
#import <Cocoa/Cocoa.h>
@interface MyViewController : NSSplitViewController <NSTableViewDataSource>
@end
MyViewController.m
#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
我想让视图控制器成为故事板中 NSTableView
的 dataSource
,但是我无法连接它们。这有什么原因吗?
在您的 NSSplitViewController
-subclass viewDidLoad
-方法中以编程方式设置数据源。您还需要实现子视图控制器 class(将 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];
}
}
}
但说实话我不喜欢这种方法。当 table 视图的数据源方法在本机视图控制器 class.
中时更好
另一种方法。 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
不要忘记实现您需要的所有 table 视图 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];
}
}
}
我在 OS X 10.10 上使用 XCode 6,并且有一个包含 window 和拆分视图控制器的故事板,如下图所示。
拆分视图控制器(在图像中突出显示)是 MyViewController
的一个实例,它具有以下代码:
MyViewController.h
#import <Cocoa/Cocoa.h>
@interface MyViewController : NSSplitViewController <NSTableViewDataSource>
@end
MyViewController.m
#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
我想让视图控制器成为故事板中 NSTableView
的 dataSource
,但是我无法连接它们。这有什么原因吗?
在您的 NSSplitViewController
-subclass viewDidLoad
-方法中以编程方式设置数据源。您还需要实现子视图控制器 class(将 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];
}
}
}
但说实话我不喜欢这种方法。当 table 视图的数据源方法在本机视图控制器 class.
中时更好另一种方法。 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
不要忘记实现您需要的所有 table 视图 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];
}
}
}