在同一个viewcontroller中的两个容器之间传递数据

时间:2013-08-02 15:17:40

标签: ios6 uistoryboard uistoryboardsegue

我是iOS编程的新手,我阅读了很多教程和论坛,但我仍然无法找到管理项目的最佳方式。

我想要的是iPad屏幕并排显示CollectionView和TableView。 CollectionView中的操作应该更改TableView内容。由于拆分的大小固定,SplitViewController不会完成这项工作。

现在我正在使用Storyboard,我创建了一个ViewController,并在其中添加了两个ContainerView。每个容器都由一个XCode生成的segue链接到一个视图控制器(LeftViewController和RightViewController)。

我正在尝试用最智能的方法来管理LeftViewController上的操作并将更改发送到RightViewController。

我想使用看似更优雅的Storyboard,但我不确定如何实现它。

2 个答案:

答案 0 :(得分:2)

假设您知道建立委托方法的方法(@protocol,请参阅here for links),关键元素将在加载时抓取嵌入容器中的两个viewControllers,将主viewController设置为委托,并且在发生变化时发送消息。对于初学者,如果通信需要在控制器之间双向流动,则为每个VC设置一个实例变量。

鉴于VCPrime,CollectionVC和TableVC:

首先,在故事板中,为每个segue命名(从containerViews到VC)。在VCPrime中,实现prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"collection"]) {
        self.collectionVC = (CollectionVC *)[segue destinationViewController];
        self.collectionVC.delegate = self;
    }
    if ([segue.identifier isEqualToString:@"table"]) {
        self.tableVC = (TableVC *)[segue destinationViewController];
        self.tableVC.delegate = self;
    }
}

您还必须在VCPrime中实现委托方法,并声明CollectionDelegate, TableDelegate,或者您为它们命名。

在CollectionVC中,当有人选择某事(或其他)时,检查代理是否响应了您的委托方法,然后发送该消息:

if ([self.delegate respondsToSelector:@selector(doSomething)]) [self.delegate doSomething];

然后在调用的方法中更改TableVC。

这只是一个快速的概述。互联网还活着,有很多代码示例。

答案 1 :(得分:1)

我想我可能在Swift方面有所改进(答案很老但是我前一天遇到了这个问题)。我在Swift中重新实现了上面的内容,但有一点扭曲。我不会将VCPrime设置为CollectionVC和TableVC的委托,而是将TableVC作为CollectionVC的委托。那是因为CollectionVC需要控制TableVC。一般来说,我们可以打电话给主人VC"控制和委托VC"被控制的那个。为了确保在我将一个VC设置为另一个的委托时实际实例化了这两个VC,我使用Swift选项和可选绑定。这是一个代码示例" (请注意,主人需要有一个" delegate"属性,您可能想要声明适当的协议):

import UIKit

class ContainerController: UIViewController {

    private var masterViewController: myMasterViewController?
    private var delegateViewController: myDelegateViewController?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "myMasterViewController" {
            masterViewController = segue.destinationViewController as? myMasterViewController
        } else if segue.identifier == "myDelegateViewController" {
            delegateViewController = segue.destinationViewController as? myDelegateViewController
        }
        if let master = masterViewController, delegate = delegateViewController {
            println("Master and delegate set")
            master.delegate = delegate
        }
    }
}