2013-04-15 12 views
8

Mam bardzo dziwne zachowanie podczas używania UIPageViewController w mojej aplikacji. Podczas pierwszego przesunięcia do następnego widoku lub w dowolnym momencie, gdy nastąpi zmiana kierunku przesuwania (tj. Na końcu listy i powrót), wynikowy widok jest pusty i muszę ponownie przesunąć ten sam kierunek, aby wyświetlić odpowiedni widok.UIPageViewController Second View Goes Blank

Przykład workflow z 3 widoki:

  1. Pierwszy widok prezentowane
  2. Przesuń w prawo
  3. drugi widok miga i obecnie
  4. przesunięcie w prawo
  5. Drugi pogląd przedstawiony
  6. Przesunięcie w prawo
  7. Trzeci widok przedstawiony
  8. przesunięcie w lewo
  9. drugi widok miga i poza
  10. przesunięcie w lewym
  11. Drugi pogląd przedstawiony

zauważyłem poprzez rejestrowanie gdy miga się dzieje (2 & 3 powyżej), sekwencja zdarzeń jest następująca:

  1. GetNextViewController nazywa
  2. GetPreviousViewController nazywa
  3. GetNextViewController nazywa

Wtedy kiedy przesuń ponownie GetNextViewController jest odpowiednio nazywane a widok jest pokazany.

Mój problem polega oczywiście na tym, że drugi widok powinien być wyświetlany bez mrugania. Próbowałem różnych rzeczy, ale nic nie było owocne.

UPDATE

Oto przykład aplikacja pojedynczy kontroler, który reprodukuje problem:

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

Odpowiedz

9

iOS wezwie GetPreviousViewController i GetNextViewController dwukrotnie: najpierw dla regulatora prądu i drugi dla backflip z regulatora prądu .

powinien to zrobić

prąd = current.Previous;

tylko przy pierwszym połączeniu.

Sprawdź referenceViewController to zrobić:

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; 
    } 
Powiązane problemy