委托返回不正确的 ViewController 实例数
Delegate Returning Incorrect Instance Number of ViewController
我有一个 ViewController "LandingPageViewController",其中有一个嵌入式页面ViewController "pageViewController"。
我创建了一个委托函数来从 "pageViewController" 写入 LandingPageViewControlelr”。这工作正常并且数据被发送到 "LandingPageController" 但是我无法与它的任何元素交互,因为委托正在创建一个新实例。
当应用程序首次启动时,它会转到 "LandingPageViewController" 如果我在 viewDidLoad 和 viewDidAppear 中打印(self),结果如下:
Delegate viewDidLoad...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
Delegate viewDidAppear...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
然后,当我滚动到第 3 页并调用委托时,我得到以下 print(self)
结果
Delegate function...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf2940e3a0>
这是我的 "LandingPageViewController" 接收数据的代码:
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)")
}
}
这是来自 "pageViewController" class 的代码:
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 到 "pageViewController" 的第一页,但问题是我必须正确定义UIPageViewController 中的页面索引,代码如下:
self.delegate = self.childViewControllers[0] as! pageViewController
我不确定这在上面的问题中是如何工作的,因为 LandingPageViewController 是父页面?页面的ViewController?
self.indexDelegate = LandingPageViewController()
不正确,因为您正在以编程方式实例化一个新的视图控制器,而不是引用故事板已经为您实例化的视图控制器。
您有一个嵌入转场,用于将页面视图控制器嵌入到另一个视图控制器的场景中。因此,您可以在 parent 视图控制器中使用 prepareForSegue
在 child 视图控制器中设置您想要的任何属性。
但是,如果您只是在 parent 中查找对 child 视图控制器的引用,则为 childViewControllers.first
或 childViewControllers[0]
。如果 child 正在寻找对其 parent 视图控制器的引用,它只是 parent
(或者在您的情况下,parent as? GetMyIndexDelegate
)。
我有一个 ViewController "LandingPageViewController",其中有一个嵌入式页面ViewController "pageViewController"。
我创建了一个委托函数来从 "pageViewController" 写入 LandingPageViewControlelr”。这工作正常并且数据被发送到 "LandingPageController" 但是我无法与它的任何元素交互,因为委托正在创建一个新实例。
当应用程序首次启动时,它会转到 "LandingPageViewController" 如果我在 viewDidLoad 和 viewDidAppear 中打印(self),结果如下:
Delegate viewDidLoad...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
Delegate viewDidAppear...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf29406e60>
然后,当我滚动到第 3 页并调用委托时,我得到以下 print(self)
结果Delegate function...<ParseStarterProject_Swift.LandingPageViewController: 0x7fbf2940e3a0>
这是我的 "LandingPageViewController" 接收数据的代码:
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)")
}
}
这是来自 "pageViewController" class 的代码:
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 到 "pageViewController" 的第一页,但问题是我必须正确定义UIPageViewController 中的页面索引,代码如下:
self.delegate = self.childViewControllers[0] as! pageViewController
我不确定这在上面的问题中是如何工作的,因为 LandingPageViewController 是父页面?页面的ViewController?
self.indexDelegate = LandingPageViewController()
不正确,因为您正在以编程方式实例化一个新的视图控制器,而不是引用故事板已经为您实例化的视图控制器。
您有一个嵌入转场,用于将页面视图控制器嵌入到另一个视图控制器的场景中。因此,您可以在 parent 视图控制器中使用 prepareForSegue
在 child 视图控制器中设置您想要的任何属性。
但是,如果您只是在 parent 中查找对 child 视图控制器的引用,则为 childViewControllers.first
或 childViewControllers[0]
。如果 child 正在寻找对其 parent 视图控制器的引用,它只是 parent
(或者在您的情况下,parent as? GetMyIndexDelegate
)。