2017-02-10 63 views
0

我想创建一个委托函数来重新加载事件上不同视图控制器中的集合视图。获取用于代理功能的ViewController的正确实例

为此,我定义了一个协议,在类中设置委托和一个简单的委托函数。

protocol ReloadCollectionDelegate: class { 
    func reloadCollectionViewFromDelegate() 
} 


class JourneyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UITabBarControllerDelegate, UIScrollViewDelegate, ReloadCollectionDelegate { 

    // delegate function from downloadCollectionController to relaod collection 
    func reloadCollectionViewFromDelegate() { 
     // simply call the reload function 
     reloadCollection() 
    } 

而且在我的类,将调用上面的函数:

// define the delegate for use 
weak var reloadJourneyDelegate: ReloadCollectionDelegate? 

// reload the collection view in JourneyViewController 
let JVC = self.viewController.storyboard!.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController 
self.reloadJourneyDelegate = JVC 
self.reloadJourneyDelegate?.reloadCollectionViewFromDelegate() 

打印(JVC):

JourneyViewController: 0x7fc7f7c55bf0 

打印(个体经营) - 从JourneyViewController(viewDidLoad中):

JourneyViewController: 0x7fc7f7e2db10 

所以我越来越相同视图控制器的不同实例。

我如何定义这个,所以我有正确的实例并可以修改UI?

感谢

+0

你在哪里调用viewDidLoad中? –

+0

在类JourneyViewController中的viewDidload()中打印self – Pippo

回答

1

该行创建的JourneyViewController

self.viewController.storyboard!.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController 

一个新的实例,您必须有办法重提JourneyViewController的原始实例。无论是具有指向它,或者如果两个视图控制器是一个层次,从而JourneyViewController是另一个视图控制器的父属性:

class ViewControllerA: UIViewController { 
    override viewDidLoad() { 
     let button = UIButton(frame: CGRect(x: self.view.bounds.width/2, y: 400, width: 50, height: 50)) 
     button.backgroundColor = UIColor.black 
     button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside) 
     self.view.addSubview(button) 
    } 

    func buttonPressed() { 
     let journey = self.parent as! JourneyViewController 
     journey.reloadCollection() 
    } 
}