【问题标题】:Delegate Returning Incorrect Instance Number of ViewController委托返回不正确的 ViewController 实例数
【发布时间】:2017-05-30 05:30:02
【问题描述】:

我有一个 ViewController “LandingPageViewController”,它有一个嵌入式 PageViewController “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 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 是父级? pageViewController 的?

【问题讨论】:

  • 无关,但作为编程风格的问题,我建议将pageViewController 类重命名为PageViewController(或以大写字母开头的名称)。类和类型应始终以大写字母开头。这不是必需的,但它是一个让您的代码更具可读性的约定问题...
  • 困扰了我一段时间的,它在列表中

标签: ios swift uiviewcontroller delegates uipageviewcontroller


【解决方案1】:

self.indexDelegate = LandingPageViewController() 不正确,因为您正在以编程方式实例化一个新的视图控制器,而不是引用情节提要已经为您实例化的视图控制器。

您有一个 embed segue,用于将页面视图控制器嵌入到另一个视图控制器的场景中。因此,您可以在父视图控制器中使用prepareForSegue 在子视图控制器中设置您想要的任何属性。

但如果您只是在父视图控制器中寻找对子视图控制器的引用,则它是 childViewControllers.firstchildViewControllers[0]。如果孩子正在寻找对其父视图控制器的引用,它只是parent(或者在你的情况下,parent as? GetMyIndexDelegate)。

【讨论】:

  • 转场是从 LandingPageViewController 到 pageViewController。代表要去哪里,这仍然有效吗?
  • 在父视图控制器的prepareForSegue中,设置子的indexDelegate引用self(即父)。或者,可能更简单,子视图控制器中实际上有一个名为parent 的现有属性,您可以使用它。
  • 谢谢。我从未使用过 prepareForSegue 方法,并且在这种情况下由于方向性问题而无法理解它。我将不得不研究在这种情况下父属性将如何工作。可能会更流畅(至少在我看来)
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多