从情节提要中的菜单选择将数据传递到 table 视图控制器

Passing data into a table view controller from a menu selection in a storyboard

我正在努力了解如何访问要在 table 视图中显示的模型数据,以及如何准确地从我的另一部分向视图控制器提供该数据应用。当保存数据的 MSMutableArray 是 Table View Controller 接口的一部分时,我想我对 table 视图的工作方式有了很好的理解。当我想显示的数据在其他地方初始化时,我开始变得有些困惑。

在我的应用程序中,我最终想要在 table 视图中显示的数据是从 XML 文件中读取和处理的。出于这个问题的目的,它看起来像这样:

//
//  bunchOfData.h
//

@interface bunchOfData : NSObject

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

@end

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

我提供了一个菜单,允许用户在包含 table 的新 window 数组中显示来自 'info' MSMutable 数组的数据看法。菜单在故事板中定义,window 包含 NSTable 视图,我已经按照您的预期将菜单项的转接连接到 window。

这是 table 视图控制器的 header:

//
// 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

现在,我有点迷茫的是如何将 bunchOfData.h 中的 'info' 数组引用到我的 table 视图控制器(如 'data =' 源文件中的占位符。

当包含 table 视图的 window 被连接到window 通过故事板?故事板似乎隐藏了很多必要的细节,我不确定如何获得这些细节。

谢谢!

我相信将数据获取到视图控制器的正确方法是使用来自原始视图控制器的 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 的标识符,而不是检查视图控制器 class。如果您有多个 segues 连接到具有相同 class 的视图控制器,这将很有用。标识符是在界面生成器的情节提要中设置的。

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

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

    return YES;
}