【问题标题】:Setting dataSource for NSTableView across scenes in a storyboard在情节提要中跨场景设置 NSTableView 的数据源
【发布时间】:2015-03-09 21:42:03
【问题描述】:

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

拆分视图控制器(图中突出显示)是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

我想让视图控制器成为我故事板中NSTableViewdataSource,但是我无法连接它们。这是有原因的吗?

【问题讨论】:

    标签: cocoa nstableview osx-yosemite nsstoryboard


    【解决方案1】:

    在您的NSSplitViewController-subclass viewDidLoad-方法中以编程方式设置数据源。您还需要实现子视图控制器类(将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];
        }
      }
    }
    

    【讨论】:

    • 嗯,不理想,但它可以完成工作;谢谢。我希望有一种方法可以只使用故事板,因为 Apple 似乎认为现在每个人都应该使用故事板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多