3

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

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

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

我试图找出最聪明的方法来管理 LeftViewController 上的操作并将更改发送到 RightViewController。

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

4

2 回答 2

2

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

给定 VCPrime、CollectionVC 和 TableVC:

首先,在故事板中,为每个 segue 命名(从 containerViews 到 VCs)。在 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。

这只是一个简短的概述。互联网上有很多很棒的代码示例。

于 2013-08-02T22:27:26.283 回答
1

我想我可能会在 Swift 上有所改进(答案很旧,但我在一天前就遇到了这个问题)。我在 Swift 中重新实现了上述内容,但有所不同。我不会将 VCPrime 设置为 CollectionVC 和 TableVC 的委托,而是将 TableVC 设置为 CollectionVC 的委托。那是因为 CollectionVC 需要控制 TableVC。一般来说,我们可以称“主 VC”为控制者,而“委托 VC”为被控制者。为了确保当我将一个 VC 设置为另一个的委托时,两个 VC 都被实际实例化,我使用了 Swift 选项和可选绑定。这是一个代码示例”(请注意,master 需要有一个“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
        }
    }
}
于 2015-08-26T06:56:57.473 回答