【问题标题】:How to pass data to a view controller within an container view?如何将数据传递给容器视图中的视图控制器?
【发布时间】:2016-06-03 02:04:08
【问题描述】:

我只是 iOS 编程的新手。

我最近遇到了一个棘手的问题。场景是:我现在有一个UIViewController(假设它被称为A),它包含一个容器视图,该容器视图包含一个UITableViewController(我们称之为B)。当我在UIViewController 中按UIButton 时,我只想将NSMutableArray 从A 传递到B。但是,由于嵌入 segue 的设计使得 UITableViewController's viewDidLoad 方法可以在 UIViewController 加载后立即执行。

有没有人知道在这种情况下传递数据?只是想知道...

更新: 【这两个VC的故事板】[1]

【问题讨论】:

    标签: ios objective-c uiviewcontroller


    【解决方案1】:

    您不能像这样简单地将其传递到 prepareForSegue 方法中的任何原因:

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        switch segue.identifier {
    
        case "tableViewController"?:
            if let tableViewVC = segue.destinationViewController as? TableViewVC {
                tableViewVC.myArray = passedArray
            } ...
    

    哦 - obj-c 在伪代码中会是这样的:

    - (void)prepareForSegue:(NSStoryboardSegue*)segue sender:(id)sender {
    
    if ([[segue identifier] isEqualToString:@"tableViewController"]) {
    
        NSViewController *vc = [segue destinationController];
        if ([vc isKindOfClass:[tableViewVC class]]) {
            tableViewVC.myArray = passedArray;
    

    没有看到你的标签:]

    编辑: 以下是通过通知传递的大致内容: 在你的 UIViewController 的标题中声明:

    #define nArrayReadyNotification @"ArrayReadyNotification"
    

    在您的 UIViewController 的 .m 文件中,在发送数组后发送通知:

    [[NSNotificationCenter defaultCenter] postNotificationName: nArrayReadyNotification object:ARRAY];
    

    在您的 tableView 的 viewDidLoad 注册通知中:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(arrayReceived:) name: nArrayReadyNotification object:nil];
    

    这将是您的表格视图中的 arrayReceived 方法:

    - (void) arrayReceived:(NSNotification *)notificaiton {
    
    NSArray *array = [notificaiton object];
    if (array != nil) {
    
        ...
    }
    

    最后在 dealloc 中取消注册您的表视图:

    - (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    

    这应该可以在您想要的任何时候发送 - 也许在计时器之外。不过,KVO 会是我的首选。

    【讨论】:

    • 感谢您的回复。好吧,我真正的问题是 viewDidLoad 方法被调用得太早了。我已经想到了替代方案,例如使用委托来传递数据。
    • 啊 - 不太明白你主要问题的最后一句话。表视图很少在 viewDidLoad 上完全加载。根据您的情况,您可以使用多种机制。关键值观察是一个不错的选择。另一种更简单的方法是触发通知。实际上,您可以将整个数组打包到它的对象参数中。
    • 是的,我的意思是调用了 TableViewVC 的 viewDidLoad(因为容器视图)。通知将是一个很好的尝试方式。
    • 您是否考虑过让您的视图控制器成为您的表格视图的数据源和/或委托?如果您的实现允许,那当然是显而易见的选择。
    • 由于我创建了一个TableViewController,所以设置了tableview委托和数据源委托。
    【解决方案2】:

    ContainerView 做了 3 件事

    [A.view addSubview:B.view]
    [A addChildViewController:B]
    [B didMoveToParentViewController:A]
    

    如果你只想将 NSMutableArray 从 A 传递到 B,你可以这样做

    UITableViewController *second = A.childViewControllers[0]
    second.XXXXX = .....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多