gpt4 book ai didi

cocoa - 在 Storyboard中跨场景设置 NSTableView 的数据源

转载 作者:行者123 更新时间:2023-12-03 17:20:47 24 4
gpt4 key购买 nike

我在 OS X 10.10 上使用 XCode 6,并且有一个 Storyboard,其中包含一个带有分割 View Controller 的窗口,如下图所示。

My storyboard

分割 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

我想让 View Controller 成为 Storyboard中 NSTableViewdataSource,但我无法连接它们。这有什么原因吗?

最佳答案

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

但说实话我不喜欢这种方法。当 TableView 的数据源方法位于 native View Controller 类中时会更好。

另一种方法来做到这一点。 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

不要忘记实现您需要的所有 TableView 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];
}
}
}

关于cocoa - 在 Storyboard中跨场景设置 NSTableView 的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28553290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com