使用UIPageViewController
时,不需要实现这些方法在页面(ViewControllers)之间导航。
您应该落实在UIPageViewController
的IUIPageViewControllerDataSource
界面右侧并设置数据源为this
或子类UIPageViewControllerDataSource
,并设置为数据源创建的对象。
在任一情况下,你将被执行/覆盖这两种方法
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
这些返回将要显示的页(UIViewController中)的方法。
在这里,您只需找到屏幕上当前控件的索引,并获取下一个或上一个并从集合中返回该项目。
获得下的ViewController:
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
获取先前的ViewController:
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
不同的是,这些方法被称为只有当过渡已顺利完成。
下面是完整的代码:
public partial class MyPageViewController : UIPageViewController, IUIPageViewControllerDataSource
{
List<UIViewController> MyViewControllers = new List<UIViewController>();
public MyPageViewController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
var redViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("redViewController");
var greenViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("greenViewController");
var blueViewController = UIStoryboard.FromName("Main", null).InstantiateViewController("blueViewController");
MyViewControllers.Add(redViewController);
MyViewControllers.Add(greenViewController);
MyViewControllers.Add(blueViewController);
DataSource = this;
SetViewControllers(new UIViewController[] { MyViewControllers.First() }, UIPageViewControllerNavigationDirection.Forward, true, null);
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
}
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var nextIndex = index + 1;
return MyViewControllers.ElementAtOrDefault(nextIndex);
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
var index = MyViewControllers.IndexOf(referenceViewController);
var previousIndex = index - 1;
return MyViewControllers.ElementAtOrDefault(previousIndex);
}
}
希望这有助于!
这绝对有帮助,谢谢!但是现在我遇到了这个问题。我需要能够确切了解刷卡何时发生并完成,以便能够更新新可见控制器周围的数据。在这种情况下,每个控制器都包含一些媒体,这些媒体可以有与该媒体关联的评论所以我需要能够在传呼机内看到一个新的控制器时更新评论列表。在这个实现中,GetNext/PreviousViewController方法以非常难以知道何时完成过渡与何时过渡的方式启动... – kformeck
开始然后取消(通过在一个方向上中途向后滑动然后返回再次)。 – kformeck
我试图解决的问题是,当用户执行半挥动(转换被取消,即在DidFinishAnimating,finished = true,completed = false)时,注释并不总是与可见媒体正确对齐 – kformeck