C# 对于UIPageViewController,我如何正确实现这些方法?
我的UIPageViewControllerDelegate方法有问题。当用户向一个方向滑动时,它无法正确跟踪页面,无法完成该滑动并滑动回第一页 前 我在第一页,从右向左滑动 当我刷卡时,我看到了第2页。但是,在“从第1页到第2页”的转换完成之前,我停止朝那个方向滑动,从左向右滑动,而不用抬起手指。 现在我在第1页,但我看到的一切都与第2页一致。 以下是我如何实现这些方法:C# 对于UIPageViewController,我如何正确实现这些方法?,c#,ios,iphone,xamarin,uipageviewcontroller,C#,Ios,Iphone,Xamarin,Uipageviewcontroller,我的UIPageViewControllerDelegate方法有问题。当用户向一个方向滑动时,它无法正确跟踪页面,无法完成该滑动并滑动回第一页 前 我在第一页,从右向左滑动 当我刷卡时,我看到了第2页。但是,在“从第1页到第2页”的转换完成之前,我停止朝那个方向滑动,从左向右滑动,而不用抬起手指。 现在我在第1页,但我看到的一切都与第2页一致。 以下是我如何实现这些方法: public Action<int> PageSwiped { get; set; } public ove
public Action<int> PageSwiped { get; set; }
public override void WillTransition(
UIPageViewController pageViewController, UIViewController[] pendingViewControllers)
{
_currentController = pendingViewControllers[0] as AssetViewController;
}
public override void DidFinishAnimating(
UIPageViewController pageViewController, bool finished,
UIViewController[] previousViewControllers, bool completed)
{
if (completed)
{
PageSwiped(_currentController.CurrentMedia.Content.ProofIndex);
}
}
与
而且有完全相同的问题
所以这两种方法肯定有我做错的地方,有什么建议吗?当使用UIPageViewController时,您不需要实现这些方法来在页面之间导航ViewController
您应该在UIPageViewController中实现IUIPageViewControllerDataSource接口,并将数据源设置为this,或者将UIPageViewControllerDataSource子类设置为创建的对象
在任何一种情况下,您都将实现/覆盖这两种方法
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
这些方法返回将显示的页面UIViewController
在这里,您只需找到当前屏幕上控件的索引,并获取下一个或上一个,然后从集合中返回该项
获取下一个ViewController:
获取上一个ViewController:
不同之处在于,只有在转换成功完成时才调用这些方法
以下是完整的代码:
希望这有帮助 这绝对有帮助,谢谢!但我现在有个问题;我需要能够准确地知道刷卡发生和完成的时间,以便能够更新新可见控制器周围的数据。在这种情况下,每个控制器都包含一些媒体,这些媒体可以有与该媒体相关联的注释。因此,我需要能够在寻呼机中看到新控制器时更新注释列表。通过这一实施,,GetNext/PreviousViewController方法的触发方式使得很难知道转换是何时完成的,而不是转换是何时开始的,然后通过在一个方向上滑动一半然后再次滑动来取消。我试图解决的问题是,当用户执行半刷切换被取消,即在DidFinishAnimating中,finished=true,completed=false@kformeck如果需要在显示时更新ViewController的状态,为什么不在ViewController ViewWillExample方法中更新它?每次用户滑入ViewController时,都会在每个ViewController上调用此方法。太好了!在ViewWillDisplay中执行所有视图更新逻辑就是这样做的。谢谢,既然一切正常,我就接受你的回答。
if (finished)
UIViewController IUIPageViewControllerDataSource.GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
UIViewController IUIPageViewControllerDataSource.GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
{
}
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);
}
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);
}
}