首页 > 解决方案 > 从情节提要中的菜单选择将数据传递到表格视图控制器

问题描述

我正在尝试访问要在表格视图中显示的模型数据,以及如何从我的应用程序的另一部分将这些数据提供给视图控制器。我认为当保存数据的 MSMutableArray 是表视图控制器接口的一部分时,我对表视图的工作方式有了很好的理解。当我想显示的数据在其他地方初始化时,我开始变得有些困惑。

在我的应用程序中,我最终希望在表格视图中显示的数据是从 XML 文件中读取和处理的。就这个问题而言,它看起来像这样:

//
//  bunchOfData.h
//

@interface bunchOfData : NSObject

@property (strong) Profile          *overview;
@property (strong) NSMutableArray   *info;

@end

数据挂在“bunchOfData”中,并在整个应用程序中用于各种任务。

我提供了一个菜单,允许用户在包含表格视图的新窗口中显示来自“信息”MSMutableArray 的数据。菜单是在情节提要中定义的,包含 NSTableView 的窗口也是如此,并且我已经按照您的预期将菜单项的 segue 连接到了窗口。

这是表视图控制器的标题:

//
// TableViewController.h
//

@interface TableViewController : NSViewController <NSTableViewDataSource> {
@private
    IBOutlet NSTableView *tableView;
    bunchOfData          *data;
}
@end

来源:

@implementation TableViewController

- (id)init
{
    self = [super init];
    if (self)
        data =          // Hmmm.... I'd like to assign 'info' to this
    return (self);
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return [data.info count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
            :
            :
    return [value for the object in the table];
}
@end

现在,如果我有点迷失,是如何获取对 bundleOfData.h 中的“信息”数组的引用到我的表视图控制器(如源文件中的“数据 =”占位符所述。

当包含表视图的窗口被通过情节提要连接到窗口的菜单打开时,如何使用对内部数据的引用来初始化表视图控制器?故事板似乎隐藏了很多必要的细节,我不确定如何找到这些细节。

谢谢!

标签: objective-cxcodemacoscocoanstableview

解决方案


我相信将数据获取到视图控制器的正确方法是使用prepareForSegue:sender:原始视图控制器中的函数。如果您在拥有菜单的视图控制器中实现此功能,它将在控制权转移到新视图控制器之前被调用。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.destinationViewController isKindOfClass:[TableViewController class]]) {
        TableViewController *vc = (TableViewController *)segue.destinationViewController;
        vc.data = info;
    }
}

if声明是为了确保我们在正确的 segue 上运行。如果您有多个要向其传递数据的 segue,则可以添加多个if- else if-else if以在同一函数中处理它们中的每一个。您可以检查 segue 的标识符,而不是检查视图控制器类。如果您有多个连接到具有相同类的视图控制器的 segue,这将很有用。标识符是在界面生成器的情节提要中设置的。

另一个值得一提的方便功能是shouldPerformSegueWithIdentifier:sender:您可以使用它来取消转场。

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"SegueA"] && !self.allValuesGood)
        return NO;

    return YES;
}

推荐阅读