我一直在使用XLPagerTabStrip在我的视图控制器顶部有效地创建一个标签栏,其中显示了多个子视图控制器。让我们调用Home作为父控制器,它扩展了 ButtonBarPagerTabStripViewController 。有两个子视图控制器,Child1和Child2。一切都像我预期的那样完美。但现在我需要一个需求,我必须以编程方式切换子视图控制器。即,当一个进程(在child2中)完成时,它应该触发将选项卡从Child 2切换到Child1。我知道有几种方法,
func moveToViewController(at index: Int)
func moveToViewController(at index: Int, animated: Bool)
func moveTo(viewController: UIViewController)
func moveTo(viewController: UIViewController, animated: Bool)
但我不知道如何使用它。
答案 0 :(得分:6)
该方法非常简单,但您需要在主页(父视图控制器)中调用它
在Child2视图控制器类中,编写如下代码
//after some process done here
let parentViewController = self.parent! as ParentViewController
parentViewController.moveToViewController(at: 0) //Assume your child1 view controller is on index 0
答案 1 :(得分:1)
**这些方法可以使用如下:
将通过委托
展示如何使用这些功能func moveToViewController(在index:Int处):
您需要传递目标子控制器的索引,为此您可以通过初始化父控制器从子控制器调用此func,或者您可以设置将在父控制器中实现并应触发的委托从您的子视图控制器,最终它将选择带动画的目标控制器。
protocol MyDelegate {
func selectChildControllerAtIndex(toIndex: Int!)
func selectViewController(viewController: UIViewController)
}
需要在父控制器中实现ChildProcceedPressedDelegate
在selectViewController中,您需要从子控制器传递目标控制器的引用,您可以将其存储在某处并传递它。
internal func selectViewController(viewController: UIViewController) {
moveTo(viewController: viewController, animated: true)
}
在selectChildControllerAtIndex中,您只需传递目标控制器的索引:
func selectChildControllerAtIndex( toIndex: Int!) {
self.moveToViewController(at: index, animated: true)
}
func moveToViewController(索引:Int,动画:Bool):
它的工作方式与上述方法相同,但如果您想要为目标控制器设置动画,则可以通过此方法。使用delegate:selectChildControllerAtIndex
func moveTo(viewController:UIViewController)
它通过传递目标子控制器引用来工作,它将动画到目标控制器。 by delegate:selectViewController
func moveTo(viewController:UIViewController,animated:Bool)
它通过传递目标子控制器引用来工作,它将根据您的选择动画到目标控制器。 by delegate:selectViewController
答案 2 :(得分:0)
这是移动任何特定子视图控制器的完美解决方案。你只需要一些延迟来改变视图控制器
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.moveToViewController(at: 1, animated: true)
}
在 viewDidLoad()
方法中调用这行代码。