1

OS X 10.10 で XCode 6 を使用しており、次の図に示すように、分割ビュー コントローラーを含むウィンドウを含むストーリーボードがあります。

私の絵コンテ

Split View Controller (画像で強調表示されている) は のインスタンスで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

ビュー コントローラーをストーリーボードdataSourceNSTableViewにしたいのですが、接続できません。これには理由がありますか?

4

1 に答える 1

0

NSSplitViewController-subclass viewDidLoad-method で、データ ソースをプログラムで設定します。子View Controllerクラスも実装する必要があります(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];
    }
  }
}
于 2015-03-09T13:42:03.030 に答える