2013-03-10 38 views
28

Tôi có một số UIPageViewController mà tôi đang cung cấp dữ liệu trang để sử dụng triển khai UIPageControllerDelegateUIPageControllerDataSource.Làm mới UIPageViewController - sắp xếp lại các trang và thêm các trang mới

Tất cả đều hoạt động tốt, nhưng tôi muốn có thể thêm các mục vào dữ liệu trang và sắp xếp lại dữ liệu trang.

Nếu người dùng đã đến cuối trang và sau đó tôi thêm một mục, họ không thể truy cập trang tiếp theo vì viewControllerAfterViewController: đã được gọi. Nếu họ cuộn lại một và sau đó chuyển tiếp hai họ có thể đến trang mới, vì vậy dữ liệu được thiết lập chính xác. Làm thế nào tôi có thể nói cho các UIPageViewController để làm mới cửa hàng của nó về những gì tiếp theo?

Tương tự, tôi muốn sắp xếp lại bộ sưu tập đang sao lưu chế độ xem trang. Nhưng nếu tôi làm điều này tôi sẽ nhận được cùng một vấn đề - xem trang sẽ nghĩ rằng trang tiếp theo vẫn là những gì nó là lần cuối cùng trang hiện tại được tải.

Tôi đoán tôi đang tìm kiếm một cái gì đó tương tự như reloadData: trên UITableView.

Trả lời

23

Bạn cần gọi số setViewControllers:direction:animated:completion:.

Ngoài ra, trong iOS 6, hãy chú ý xem bạn có đang sử dụng kiểu UIPageViewControllerTransitionStyleScroll hay không, vì có lỗi chính trong bộ nhớ đệm nếu animated: là CÓ (xem thảo luận của tôi tại đây: UIPageViewController navigates to wrong page with Scroll transition style).

+2

Cảm ơn - các setViewControllers: hướng: hoạt hình: Dự kiến ​​hoàn thành đã làm nó. Chúc mừng cho đề cập đến lỗi quá. – ssloan

76

Tôi tìm thấy một workaround để buộc UIPageViewController quên về bộ điều khiển xem cache của các trang láng giềng rằng hiện không được hiển thị:

pageViewController.dataSource = nil; 
pageViewController.dataSource = self; 

tôi mọi này, tôi thay đổi các thiết lập của trang. Tất nhiên điều này không ảnh hưởng đến trang hiện đang được hiển thị.

Với cách giải quyết này, tôi tránh lỗi bộ nhớ đệm và vẫn có thể sử dụng animated:YES trong setViewControllers:direction:animated:completion:.

+3

Thú vị. Bạn bỏ đặt và đặt lại dataSource ở đâu? Trước 'setViewControllers: direction: animated: completion:', sau nó, hoặc trong khối hoàn thành? Cảm ơn. – ernesto

+0

Trên thực tế, tôi làm điều này 0,01 giây sau khi đã hoàn thành trong khối dispatch_async. –

+1

Dường như làm việc tuyệt vời, cảm ơn phản hồi của bạn! – ernesto

1

Dưới đây là thực hiện hoàn chỉnh của tôi câu trả lời @ Ortwin-gentz trong phương pháp didFinish đại biểu trong Swift 2, hoạt động hoàn hảo cho tôi:

func pageViewController(
    pageViewController: UIPageViewController, 
    didFinishAnimating finished: Bool, 
    previousViewControllers: [UIViewController], 
    transitionCompleted completed: Bool 
) { 
    if !completed { return } 
    dispatch_async(dispatch_get_main_queue()) { 
     pageViewController.dataSource = nil 
     pageViewController.dataSource = self 
    } 
} 
Các vấn đề liên quan