ios - 委托(delegate)创建 ViewController 的新实例

标签 ios swift delegates

我通过委托(delegate)方法将数据发送到 View Controller 。在接收数据的 View Controller 中,如果我在 viewDidLoadprint(self) 我得到这个值:

<PageViewControllerImage: 0x7fba16d0dc40>

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

<PageViewControllerImage: 0x7fba16e0eab0>

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

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

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.
}

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

Defined Instance <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365f06260>

viewDidLoad: <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365d0c940>

Inside delegate: <ParseStarterProject_Swift.PageViewControllerImage: 0x7fb365f06260>

最佳答案

委托(delegate)通常是在外部设置的,并且应该是可选的。

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

根据您转换到 PageViewControllerImage Controller 的方式,可以通过多种方式实现这一点。

如果您设置了 Storyboard Segue,则可以在 prepareForSegue 中设置委托(delegate)。例如:

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

或者,如果您手动转换到新 Controller ,则可以将委托(delegate)设置为该实例。

关于ios - 委托(delegate)创建 ViewController 的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41656347/

相关文章:

ios - Swift UITableView 之字形边框

ios - UIWebView 检测 mp3 文件加载

Swift,如何在其他函数中使用从 VC 传回的数据?

ios - 如何读取 Firebase 子值?

java - Java 中的函数指针/委托(delegate)?

c# - 有没有办法在设置类的任何属性时调用方法?

ios - 为 UILabel 添加自定义空间

ios - 禁用TableView单元格

ios - 按核心数据中的日期组件获取条目

ios - 使多个对象成为另一个对象的委托(delegate)的最佳方法是什么?