【问题标题】:Delegate creating new instance of ViewController委托创建 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

标签: ios swift delegates


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多