1

我在 OS X 10.10 上使用 XCode 6,并且有一个故事板,其中包含一个带有拆分视图控制器的窗口,如下图所示。

我的故事板

拆分视图控制器(在图像中突出显示)是 的一个实例MyViewController,它具有以下代码:

MyViewController.h

#import <Cocoa/Cocoa.h>

@interface MyViewController : NSSplitViewController <NSTableViewDataSource>

@end

我的视图控制器.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

我想在我的故事板中制作视图控制器dataSourceNSTableView但是我无法连接它们。是否有一个原因?

4

1 回答 1

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

不要忘记实现您需要的所有表格视图dataSourcedelegate方法。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];
    }
  }
}
于 2015-03-09T13:42:03.030 回答