委托创建 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】:
委托通常是在外部设置的,应该是可选的。
我将假设indexDelegate
是ViewController
上的一个属性。您应该在转换到 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?