Vista en segundo plano de UIPageViewController se vuelve en blanco

Estoy experimentando un comportamiento muy extraño cuando uso UIPageViewController en mi aplicación. En la primera pasada a la siguiente vista o en cualquier momento en la dirección de deslizar los cambios (es decir, al final de la list y retroceder), la vista resultante está en blanco y estoy obligado a deslizar la misma dirección nuevamente para que la vista apropiada se muestre.

Ejemplo de flujo de trabajo con 3 vistas:

  1. Primera vista presentada
  2. Deslice hacia la derecha
  3. La segunda vista parpadea dentro y fuera
  4. Deslice hacia la derecha
  5. Segunda vista presentada
  6. Deslice hacia la derecha
  7. Tercera vista presentada
  8. Deslice hacia la izquierda
  9. La segunda vista parpadea dentro y fuera
  10. Deslice hacia la izquierda
  11. Segunda vista presentada

Noté vía logging cuando ocurre el parpadeo (2 y 3 arriba), la secuencia de events es la siguiente:

  1. GetNextViewController se llama
  2. GetPreviousViewController se llama
  3. GetNextViewController se llama

Luego, cuando deslizo otra vez GetNextViewController se llama apropiadamente y se muestra la vista.

Mi problema es, obviamente, la segunda vista debería mostrarse sin parpadear dentro y fuera. He intentado varias cosas pero nada fructífero.

ACTUALIZAR

Aquí hay una muestra de aplicación de controller único que reproduce el 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; } } } 

iOS llamará a GetPreviousViewController y GetNextViewController dos veces: primero para el controller actual y segundo para el backflip del controller actual.

Debes hacer eso

actual = actual.Anterior;

solo en la primera llamada.

Compruebe referenceViewController para hacer eso:

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