Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于UIPageViewController,我如何正确实现这些方法?_C#_Ios_Iphone_Xamarin_Uipageviewcontroller - Fatal编程技术网

C# 对于UIPageViewController,我如何正确实现这些方法?

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

我的UIPageViewControllerDelegate方法有问题。当用户向一个方向滑动时,它无法正确跟踪页面,无法完成该滑动并滑动回第一页

我在第一页,从右向左滑动 当我刷卡时,我看到了第2页。但是,在“从第1页到第2页”的转换完成之前,我停止朝那个方向滑动,从左向右滑动,而不用抬起手指。 现在我在第1页,但我看到的一切都与第2页一致。 以下是我如何实现这些方法:

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);
    }
}