旋转时来自UIPageViewController的NSInternalInconsistencyException

时间:2012-03-16 10:33:33

标签: c# ios cocoa-touch xamarin.ios uipageviewcontroller

我使用的是Monotouch 5.2.6和iOS SDK 5.0.1。

我有一个UIPageViewController,它是另一个视图控制器的子容器。 它是这样创建的:

pageViewController = new UIPageViewController (UIPageViewControllerTransitionStyle.PageCurl, UIPageViewControllerNavigationOrientation.Horizontal, UIPageViewControllerSpineLocation.Min);
    this.AddChildViewController (pageViewController);
    pageViewController.DidMoveToParentViewController (this);
    this.viewCurrentMode.AddSubview (pageViewController.View);

如果我旋转设备(模拟器),我会在UIApplication.SendEvent()

中收到此异常
  

抛出Objective-C异常。名称:NSInternalInconsistencyException   原因:提供的视图控制器(1)的数量与   请求的脊椎位置所需的数量(2)   (UIPageViewControllerSpineLocationMid)

脊柱位置不是“中间”而是“最小”。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

是的,您已将UIPageViewController初始化为“Min”作为脊椎位置。但是,您需要为页面控制器实现委托并覆盖GetSpineLocation方法:

public override UIPageViewControllerSpineLocation GetSpineLocation (UIPageViewController pageViewController, UIInterfaceOrientation orientation)
{

    //return spine location according to interface orientation and whatever
    //criteria you prefer

}

或者,为其GetSpineLocation属性指定一个方法(MonoTouch天堂!):

pageViewController.GetSpineLocation = (p, o) => return <spinelocation>;

不过,它看起来有点出乎意料。我假设当设备旋转到横向时,原生pageViewController:spineLocationForInterfaceOrientation:方法的默认实现返回“Mid”(尽管在Apple文档中找不到信息)。无论如何,你必须覆盖上面的方法才能做到正确。

答案 1 :(得分:0)

为了安全起见,我检查了UIPageViewControllerSpineLocation的值,它们与Apple documentation的值相符。

Dimitris也是正确的,默认的内部,委托(当没有提供时)在没有指定用户提供的回调时返回UIPageViewControllerSpineLocation.Mid(即UIPageViewController.GetSpineLocation时未分配)。

这是自动生成的绑定代码,因此如果没有提供默认值的常量,没有提供任何内容,这有点棘手。但是,请随时打开错误报告(并链接到此问题),我们将对其进行审核。