【问题标题】:Passing data into a table view controller from a menu selection in a storyboard从情节提要中的菜单选择将数据传递到表格视图控制器
【发布时间】:2023-03-28 06:00:01
【问题描述】:

我正在努力了解如何访问要在 tableview 中显示的模型数据,以及如何将这些数据从我的应用程序的另一部分提供给视图控制器。我认为当保存数据的 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 中的“信息”数组的引用到我的表视图控制器(如源文件中的“数据 =”占位符所指出的那样。

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

谢谢!

【问题讨论】:

    标签: objective-c xcode macos cocoa nstableview


    【解决方案1】:

    我相信将数据获取到视图控制器的正确方法是使用原始视图控制器中的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;
    }
    

    【讨论】:

    • 谢谢!我认为这可能与prepareForSegue有关,但我在错误的地方实现了该方法。将其移动到启动视图控制器的代码中会产生很大的不同。
    猜你喜欢
    • 2012-09-21
    • 2016-02-15
    • 2014-09-12
    • 2012-06-02
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多