ios - 获取正确的 ViewController 实例以与委托(delegate)函数一起使用

标签 ios swift uiviewcontroller delegates protocols

我正在尝试创建一个委托(delegate)函数以在事件的不同 View Controller 中重新加载 Collection View 。

为此我定义了一个协议(protocol),在类中设置委托(delegate),以及一个简单的委托(delegate)函数。

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()
    }

在我的类(class)中将调用上述函数:

// 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

print(self) - 来自 JourneyViewController (viewDidLoad):

JourneyViewController: 0x7fc7f7e2db10

所以我得到了同一个 View Controller 的不同实例。

我该如何定义它才能拥有正确的实例并可以修改 UI?

谢谢

最佳答案

这一行创建了一个新的JourneyViewController实例

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

您必须有办法返回 JourneyViewController 的原始实例。通过拥有一个指向它的属性,或者如果两个 View Controller 都在一个层次结构中,使得 JourneyViewController 是另一个 View Controller 的父级:

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()
    }
}

关于ios - 获取正确的 ViewController 实例以与委托(delegate)函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42152237/

相关文章:

ios - 将 Firebase 数据库添加到 iOS 部分时遇到问题

ios - 如何在不更改字体大小的情况下快速更改 UILabel 的字体?

ios - 检测 ViewController 何时由 UINavigationController 中的前一个 VIewController "popping"呈现

ios - 使用 UINavigationController View

ios - 为什么 AVFoundation 中不存在 AVPlayerItemAudioOutput?

ios - 从 iOS 设备上传 Pdf 文档

ios - 自动布局与自动旋转冲突

ios - 从没有 Controller 的 UITableView 触发 segue

ios - 将视频播放器添加到 UITableView Cell *Swift

ios7 presentviewcontroller 无法设置框架