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:
- prima vista presentato
- Swipe a destra
- seconda vista lampeggia dentro e fuori
- Swipe a destra
- Seconda vista presentato
- Scorri verso destra
- Terza vista presentata
- scorrere a sinistra
- seconda vista lampeggia in e fuori
- striscia a sinistra
- seconda vista presentato
ho notato tramite registrazione quando il lampeggio avviene (2 & 3 sopra), la sequenza di eventi è la seguente:
- GetNextViewController è chiamato
- GetPreviousViewController è chiamato
- 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;
}
}
}