我有一个ViewController" LandingPageViewController"它有一个嵌入式的PageViewController" pageViewController"。
我创建了一个委托函数来从" pageViewController"到LandingPageViewControlelr"。这工作正常,数据被发送到" LandingPageController"但是我无法与其任何元素进行交互,因为委托正在创建一个新实例。
当应用程序首次启动时,它会转到" LandingPageViewController"如果我在viewDidLoad和viewDidAppear中打印(self),结果就是这样:
Delegate viewDidLoad...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
Delegate viewDidAppear...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
然后,当我滚动到第3页并调用代表后,我得到以下打印结果(自我)
Delegate function...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf2940e3a0>
这是来自我的&#34; LandingPageViewController&#34;的代码。正在接收数据:
protocol GetMyIndexDelegate {
func getIndex(index: Int)
}
class LandingPageViewController: UIViewController, GetMyIndexDelegate {
@IBOutlet var createAccountButton: UIButton!
//delegate functionto get index
func getIndex(index: Int) {
if index == 3 {
print("Delegate function...\(self)")
//print(createAccountButton)
}
}
override func viewDidLoad() {
super.viewDidLoad()
print("Delegate viewDidLoad...\(self)")
}
}
这是来自&#34; pageViewController&#34;的代码。类:
class pageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
let myHeight = 667
let myCenter = 333.5
// define the delegate for use
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 {
// this is the line causing problem
self.indexDelegate = LandingPageViewController()
print("PageView Index Defined As...\(self.indexDelegate)")
indexDelegate?.getIndex(index: index!)
//goToVC()
}
}
}
}
我相信这是问题所在:
self.indexDelegate = LandingPageViewController()
它定义了不正确的实例?????
作为一个侧面线索,我有另一个委托方法在另一个方向,从viewController到&#34; pageViewController&#34;的第一页。问题是我必须使用以下代码在UIPageViewController中正确定义页面的索引:
self.delegate = self.childViewControllers[0] as! pageViewController
我不确定这在上面的问题中是如何工作的,因为LandingPageViewController是父项? pageViewController?
答案 0 :(得分:0)
self.indexDelegate = LandingPageViewController()
不正确,因为您是以编程方式实例化新的视图控制器,而不是引用故事板已为您实例化的视图控制器。
您有一个嵌入segue,用于将页面视图控制器嵌入到另一个视图控制器的场景中。因此,您可以在父视图控制器中使用prepareForSegue
来设置子视图控制器中所需的任何属性。
但是,如果您只是在父母中寻找对子视图控制器的引用,那么它是childViewControllers.first
或childViewControllers[0]
。如果孩子正在寻找对其父视图控制器的引用,那么它只是parent
(或者在您的情况下,parent as? GetMyIndexDelegate
)。