我几天来一直在使用父/子视图委派的概念,目前了解如何将数据从父级提供给子级。但是,现在,我希望父(主VC)中的按钮重新加载子VC中显示的数据。
我试图委托在子VC级别中激活但在父级导航控制器中激活的方法。因此,当我按下按钮时,执行子VC中的委托方法;在我的情况下,该方法将是重载表。在尝试建立这种简单的委托关系时,为什么会出现这么多错误?
我的父/容器视图当前正在将一个方法委托给孩子,所以我从子设置 - >家长。但我想从父母那里设置 - >儿童。我差不多:
struct Constants {
static let embedSegue = "containerToCollectionView"
}
class ContainerViewController: UIViewController, CollectionViewControllerDelegate {
func giveMeData(collectionViewController: CollectionViewController) {
println("This data will be passed")
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == Constants.embedSegue {
let childViewController = segue.destinationViewController as! CollectionViewController
childViewController.delegate = self
}
}
FROM CHILD:
protocol CollectionViewControllerDelegate {
func giveMeData(collectionViewController: CollectionViewController)
}
class CollectionViewController: UIViewController {
var delegate:CollectionViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate?.giveMeData(self)
// Do any additional setup after loading the view.
}
我认为我的麻烦在于我在准备工作中宣布儿童代表,所以这很直接,但现在我想要反向授权。如何设置它以便我可以使用父VC中的子方法?
答案 0 :(得分:0)
子视图控制器没有为其他控制器提供数据的业务。它实际上甚至不应该有任何数据提取逻辑,如此通用它也被其他控制器使用。您应该将数据方法重构为新类。
此模式称为模型 - 视图 - 控制器,或MVC,是您应该理解和遵循的非常基本的概念。 Apple解释说pretty well。
通常,要将数据从控制器发送到详细控制器,请使用prepareForSegue
设置属性等。要与父控制器通信,请使用委托协议,但通常在调用时调用这些协议。细节控制器已完成其工作,只需将结果报告给父级。
如果要使用新数据更新详细信息VC(不解除它并且父项不可见),则不应将逻辑更新为父项。相反,请使用上面建议的结构。