从UITabBarController中的另一个选项卡以编程方式在UIPageViewController中翻页

时间:2017-10-17 11:44:00

标签: ios swift uitabbarcontroller uipageviewcontroller

我有一个UITabBarController作为根视图控制器。

在这个UITabBarController中,我有两个标签:tabA和tabB。

tabA是一般视图控制器,tabB是一个带有Container View的viewController,其中嵌入了一个pageViewcontroller C.

现在tabA中有一个按钮,我想实现这样的效果,当我点击这个按钮时,它会跳转到tabB并在C中显示第二个页面,每次点击按钮时,它都会调用该函数: / p>

func swipeToIndex(ToIndex: Int, completion: (()->Void)? = nil) {
    if self.currentPageIndex > 2 {
        return
    }
    if ToIndex < self.currentPageIndex {
        let toViewController = self.orderedViewControllers[ToIndex]
        self.setViewControllers([toViewController], direction: .reverse, animated: true, completion: {finish in
            self.currentPageIndex = ToIndex
            completion?()
        })
    }
    else if ToIndex > self.currentPageIndex {
        let toViewController = self.orderedViewControllers[ToIndex]
        self.setViewControllers([toViewController], direction: .forward, animated: true, completion: {finish in
            self.currentPageIndex = ToIndex
            completion?()
        })
    }
}

我只能在第二次点击按钮时才意识到这一点。第一次,它进入C的第一页。我发现它与viewDidLoad()有关。当它在

之后第一次调用函数swipeToIndex时
  

self.setViewControllers([toViewController],direction:.forward,animated:true,completion:{finish in               self.currentPageIndex = ToIndex               完成?()           })   它会调用 viewDidLoad ,里面会再次设置viewcontroller,如下所示:

if let firstViewController = orderedViewControllers.first {
        setViewControllers([firstViewController],
                           direction: .forward,
                           animated: true,
                           completion: nil)
    } 

第一次调用 swipeToIndex

时,我不知道如何避免这种情况

1 个答案:

答案 0 :(得分:0)

您需要更智能地转发消息并检查是否已加载视图。

在页面控制器中,您应该检查视图是否已加载:

func swipeToIndex(ToIndex: Int, completion: (()->Void)? = nil) {
    guard isViewLoaded else {
        self.pageToSwipeTo = ToIndex
        return
    }

所以你需要添加

var pageToSwipeTo: Int? = nil

然后在最后viewDidLoad尝试

if let pageToSwipeTo = pageToSwipeTo {
    self.pageToSwipeTo = nil
    self. swipeToIndex(pageToSwipeTo)
}

这假设页面视图控制器已经存在于您的情况中。由于您的层次结构,这可能实际上不正确,因此您可能需要甚至通过标签栏视图控制器转发消息...但是首先尝试此过程。