委托创建 ViewController 的新实例

Posted

技术标签:

【中文标题】委托创建 ViewController 的新实例【英文标题】:Delegate creating new instance of ViewController 【发布时间】:2017-01-14 23:59:55 【问题描述】:

我通过委托方法向视图控制器发送数据。在接收数据的视图控制器中,如果我在print(self) viewDidLoad 中得到这个值:

<PageViewControllerImage: 0x7fba16d0dc40>

如果我在委托函数中print(self) 我得到这个值:

<PageViewControllerImage: 0x7fba16e0eab0>

我相信这就是我定义委托的方式,它正在创建PageViewControllerImage 的新实例,但我不知道如何获取对它的现有引用?

这是我用来在发送数据的类中设置委托的方法:

self.indexDelegate = PageViewControllerImage()

-------- 编辑 --------

我正在尝试从我的 PageViewController 类发送数据:

var indexDelegate: GetMyIndexDelegate?



func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) 
    if (completed && finished) 
        if let currentVC = pageViewController.viewControllers?.last 
            let index = vcArr.index(of: currentVC)

            if index == 3 

                // call the delegate function in delegate class
                indexDelegate?.getIndex(index: index!)

            
        
    


override func viewDidLoad() 
    super.viewDidLoad()

    // just been trying to define instance first
    let storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil)
    let PageViewControllerImageInstance: PageViewControllerImage = storyboard.instantiateViewController(withIdentifier: "vc4") as! PageViewControllerImage
    print("Defined Instance \(PageViewControllerImageInstance)")
    self.indexDelegate = PageViewControllerImageInstance

然后在PageViewControllerImage类里面接收数据:

protocol GetMyIndexDelegate 
    func getIndex(index: Int)


import UIKit

class PageViewControllerImage: UIViewController, GetMyIndexDelegate 

//delegate functionto get index
func getIndex(index: Int) 
    if index == 3 
        print("Inside delegate: \(self)")

    


@IBOutlet var signupImage: UIImageView!

override func viewDidLoad() 
    super.viewDidLoad()

    print("viewDidLoad: \(self)")

    // Do any additional setup after loading the view.

即使在设置委托之前定义了 viewController 的实例,它仍然返回不同的实例编号:

Defined Instance <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365f06260>

viewDidLoad: <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365d0c940>

Inside delegate: <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365f06260>

【问题讨论】:

您只是将代理设置为PageViewControllerImage 的新实例,但您应该设置为现有实例。你在哪里设置代表? PageViewControllerImage 和作为代理的视图控制器是什么关系? 我在 viewDidLoad 中设置引用。 PageViewControllerImage 是一个 VC,它是 PageViewController 的一部分(索引 3) viewDidLoad of PageViewControllerImage?也许您可以在您的问题中添加对您要完成的工作的更大愿景。您正在尝试将数据从哪里传递到哪里? 对不起,我已经编辑了我的问题以显示更多内容。 您的UIPageViewController 子类是否实现UIPageViewControllerDataSource 【参考方案1】:

委托通常是在外部设置的,应该是可选的。

我将假设indexDelegateViewController 上的一个属性。您应该在转换到 PageViewControllerImage 实例时设置委托。

这可以通过多种方式实现,具体取决于您转换到PageViewControllerImage 控制器的方式。

如果您设置了故事板转场,则可以在prepareForSegue 中设置委托。例如:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showPageViewControllerImage" 
        guard let pageViewControllerImage = segue.destination as? PageViewControllerImage
        else 
            return
        
        self.delegate = pageViewControllerImage
    

或者,如果您要手动转换到新控制器,则可以将委托设置为该实例。

【讨论】:

我修改了问题以显示我对此的尝试。它仍在创建与其在 viewDidLoad 中的引用不同的实例【参考方案2】:

正在页面控制器类中实例化 viewControllerAfter

必须将委托定义为 pageViewController 的正确实例。

self.indexDelegate = self.childViewControllers[2] 一样! PageViewControllerImage

【讨论】:

以上是关于委托创建 ViewController 的新实例的主要内容,如果未能解决你的问题,请参考以下文章

泛型委托事件详解示例

创建一个 UIView 子类,当它的父 viewController 出现时调用委托函数?

如何使用委托Objective c从UITableViewCell.xib创建到ViewController的segue?

如何在没有情节提要的情况下创建 ViewController 并将一个设置为另一个的委托?

模态 ViewController 委托回调 - 如何?

如何在 ViewController 之间传递委托