2013-04-15 9 views
8

Durante l'utilizzo di UIPageViewController nella mia app, sto riscontrando un comportamento molto strano. Dal primo passaggio alla vista successiva o in qualsiasi momento la direzione dello scorrimento cambia (cioè alla fine dell'elenco e torna indietro), la vista risultante è vuota e mi viene richiesto di scorrere nuovamente nella stessa direzione per visualizzare la vista appropriata.UIPageViewController Seconda visualizzazione non disponibile

flusso di lavoro Esempio con 3 viste:

  1. prima vista presentato
  2. Swipe a destra
  3. seconda vista lampeggia dentro e fuori
  4. Swipe a destra
  5. Seconda vista presentato
  6. Scorri verso destra
  7. Terza vista presentata
  8. scorrere a sinistra
  9. seconda vista lampeggia in e fuori
  10. striscia a sinistra
  11. seconda vista presentato

ho notato tramite registrazione quando il lampeggio avviene (2 & 3 sopra), la sequenza di eventi è la seguente:

  1. GetNextViewController è chiamato
  2. GetPreviousViewController è chiamato
  3. GetNextViewController è chiamato

Poi quando swipe nuovamente GetNextViewController si chiama giustamente e viene mostrata la vista.

Il mio problema è, ovviamente, la seconda vista dovrebbe essere visualizzata senza il lampeggiare dentro e fuori. Ho provato varie cose ma niente di fruttuoso.

UPDATE

Ecco un esempio app controller singolo che riproduce il problema:

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

risposta

9

IOS chiamerà GetPreviousViewController e GetNextViewController due volte: prima per il regolatore di corrente e secondo per backflip regolatore di corrente .

Si dovrebbe farlo

corrente = current.Previous;

solo alla prima chiamata.

Controllare referenceViewController per farlo:

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