2013-04-15 5 views
8

Ich habe ein sehr seltsames Verhalten bei der Verwendung von UIPageViewController in meiner App. Beim ersten Streichen zur nächsten Ansicht oder wenn sich die Richtung des Wischens ändert (d. H. Am Ende der Liste und zurück), ist die resultierende Ansicht leer und ich muss die gleiche Richtung erneut wischen, damit die entsprechende Ansicht angezeigt wird.UIPageViewController Zweite Ansicht wird leer

Beispiel-Workflow mit 3 views:

  1. ersten Blick präsentiert
  2. Swipe nach rechts
  3. Zweite Ansicht blinkt und aus
  4. Swipe nach rechts
  5. Zweite Ansicht präsentiert
  6. Nach rechts wischen
  7. Dritte Ansicht dargestellt
  8. Swipe nach links
  9. Zweiten Ansicht blinkt und aus
  10. Swipe nach links
  11. Zweiten Ansicht präsentierten

ich über die Protokollierung bemerkt, wenn das Blinken (2 & 3 oben) passiert, die Abfolge der Ereignisse ist wie folgt:

  1. GetNextViewController genannt wird
  2. GetPreviousViewController heißt
  3. GetNextViewController
  4. genannt wird

Dann, wenn ich wieder GetNextViewController Swipe wird in geeigneter Weise aufgerufen und die Ansicht angezeigt wird.

Mein Problem ist, offensichtlich sollte die zweite Ansicht ohne das Blinken ein- und ausgehen. Ich habe verschiedene Dinge ausprobiert, aber nichts fruchtbares.

UPDATE

Hier ist ein Beispiel mit einem Controller-Anwendung, die das Problem reproduziert:

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

Antwort

9

IOS rufen GetPreviousViewController und GetNextViewController zweimal: zuerst für die Stromregler und den zweiten für backflip Stromregler .

Sie sollten das tun

Strom = current.Previous;

nur beim ersten Anruf.

überprüfen referenceViewController zu tun, dass:

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