我通过委托(delegate)方法将数据发送到 View Controller 。在接收数据的 View Controller 中,如果我在 viewDidLoad
中 print(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)通常是在外部设置的,并且应该是可选的。
我假设indexDelegate
是ViewController
上的一个属性。您应该在转换到 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/