2013-04-15 30 views
8

Tôi đang gặp phải một số hành vi rất kỳ lạ khi sử dụng UIPageViewController trong ứng dụng của mình. Trên lần vuốt đầu tiên đến chế độ xem tiếp theo hoặc bất kỳ lúc nào hướng chuyển đổi vuốt (tức là ở cuối danh sách và quay lại), chế độ xem kết quả trống và tôi được yêu cầu vuốt lại cùng một hướng một lần nữa để chế độ xem phù hợp hiển thị.UIPageViewController Chế độ xem thứ hai sẽ chuyển đến Blank

workflow Ví dụ với 3 quan điểm:

  1. Lượt xem đầu tiên trình bày
  2. Vuốt sang bên phải
  3. xem nhấp nháy thứ hai trong và ngoài
  4. Vuốt sang bên phải
  5. xem Thứ hai giới
  6. Vuốt sang phải
  7. Lượt xem thứ ba được trình bày
  8. Vuốt sang bên trái
  9. nhấp nháy nhìn thứ hai trong và ngoài
  10. Vuốt lên từ
  11. xem Thứ hai trái giới

tôi nhận thấy qua khai thác gỗ khi nhấp nháy xảy ra (2 & 3 ở trên), chuỗi sự kiện như sau:

  1. GetNextViewController được gọi là
  2. GetPreviousViewController được gọi
  3. GetNextViewController được gọi

Sau đó, khi tôi vuốt lại GetNextViewController được một cách thích hợp gọi và giao diện được hiển thị.

Vấn đề của tôi, rõ ràng, chế độ xem thứ hai sẽ hiển thị mà không cần nhấp nháy vào và ra. Tôi đã thử nhiều thứ nhưng không thành công.

CẬP NHẬT

Đây là một ứng dụng đơn điều khiển mẫu mà tái tạo các vấn đề:

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

Trả lời

9

iOS sẽ gọi GetPreviousViewController và GetNextViewController hai lần: đầu tiên cho điều chỉnh dòng điện và thứ hai cho backflip của điều chỉnh dòng điện .

Bạn nên làm điều đó

hiện tại = current.Previous;

chỉ khi có cuộc gọi đầu tiên.

Kiểm tra referenceViewController để làm điều đó:

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; 
    } 
Các vấn đề liên quan