2013-04-15 66 views
8

在我的应用中使用UIPageViewController时,遇到一些非常奇怪的行为。在第一次滑动到下一个视图或任何时候滑动方向发生变化(即列表结束并返回)时,结果视图为空白,我需要再次滑动相同的方向才能显示适当的视图。UIPageViewController第二个视图变为空白

实施例的工作流程与3次:

  1. 第一视图中显示
  2. 向右滑动进出
  3. 向右滑动
  4. 第二视图闪烁
  5. 第二视图呈现
  6. 向右滑动
  7. 呈现的第三种视图
  8. 滑动进出
  9. 滑动到左侧
  10. 第二视图的左
  11. 第二视图闪烁经由日志记录呈现

我注意到当闪烁发生(上述2 & 3),事件的顺序如下:

  1. GetNextViewController被称为
  2. GetPreviousViewController称为
  3. GetNextViewController称为

然后,当我再次滑动GetNextViewController被适当地称为和视图被示出。

我的问题是,显然,第二个视图应该显示没有闪烁进出。我尝试了各种各样的东西,但没有成果。

UPDATE

这里是一个示例单控制器应用程序,重新产生问题:

using System; 
using System.Drawing; 

using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using System.Collections.Generic; 

namespace TestPageView 
{ 
    public partial class TestPageViewViewController : UIViewController 
    { 
     public TestPageViewViewController() : base ("TestPageViewViewController", null) 
     { 
     } 

     public override void DidReceiveMemoryWarning() 
     { 
      // Releases the view if it doesn't have a superview. 
      base.DidReceiveMemoryWarning(); 

      // Release any cached data, images, etc that aren't in use. 
     } 

     public override void ViewDidLoad() 
     { 
      base.ViewDidLoad(); 

      var controllers = new List<UIViewController> 
      { 
       new TestViewController(View, 1), 
       new TestViewController(View, 2), 
       new TestViewController(View, 3), 
       new TestViewController(View, 4) 
      }; 

      var _pageViewController = new UIPageViewController(UIPageViewControllerTransitionStyle.Scroll, UIPageViewControllerNavigationOrientation.Horizontal); 
      var dataSource = new ViewDataSource(controllers); 
      _pageViewController.DataSource = dataSource; 
      //ViewDataSource has an indexer that returns it's controllers 
      _pageViewController.SetViewControllers(new[] { controllers[0] }, UIPageViewControllerNavigationDirection.Forward, false, null); 
      View.AddSubview(_pageViewController.View); 
     } 

     public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 
     { 
      // Return true for supported orientations 
      return (toInterfaceOrientation != UIInterfaceOrientation.PortraitUpsideDown); 
     } 
    } 

    public class TestViewController : UIViewController 
    { 
     private readonly UIView _parent; 
     private readonly int _number; 
     public TestViewController(UIView parent, int number) 
     { 
      _parent = parent; 
      _number = number; 
     } 

     public override void ViewDidLoad() 
     { 
      base.ViewDidLoad(); 

      var textView = new UITextView(_parent.Bounds); 
      textView.TextAlignment = UITextAlignment.Center; 
      textView.AttributedText = new NSAttributedString(_number.ToString(), UIFont.BoldSystemFontOfSize(18)); 
      View.Add(textView); 
     } 
    } 

    public class ViewDataSource : UIPageViewControllerDataSource 
    { 
     private LinkedListNode<UIViewController> current; 

     public ViewDataSource(IEnumerable<UIViewController> controllers) 
     { 
      var controllerLiist = new LinkedList<UIViewController>(controllers); 
      current = controllerLiist.First; 
     } 

     public override UIViewController GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController) 
     { 
      if(current.Previous == null){ 
       Console.WriteLine("returning previous nothing"); 
       return null; 
      } 
      Console.WriteLine("returning previous something"); 
      current = current.Previous; 
      return current.Value; 
     } 

     public override UIViewController GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController) 
     { 
      if(current.Next == null){ 
       Console.WriteLine("returning next nothing"); 
       return null; 
      } 
      Console.WriteLine("returning next something"); 
      current = current.Next; 
      return current.Value; 
     } 
    } 
} 

回答

9

的iOS将调用GetPreviousViewController和GetNextViewController两次:第一次为电流控制器和第二对电流控制器的后空翻。

你应该做的

电流= current.Previous;

只在第一次通话。

检查referenceViewController做到这一点:

public override UIViewController GetPreviousViewController (UIPageViewController pageViewController, UIViewController referenceViewController) 
    { 
     var __c = Pages.Find(referenceViewController); 

     if (__c.Previous != null) 
      return __c.Previous.Value; 
     else 
      return null; 
    } 
    public override UIViewController GetNextViewController (UIPageViewController pageViewController, UIViewController referenceViewController) 
    { 
     var __c = Pages.Find(referenceViewController); 

     if (__c.Next != null) 
      return __c.Next.Value; 
     else 
      return null; 
    }