2017-09-11 32 views
7

Tôi có một số pageviewcontroller, nhưng khi tôi vuốt sang trang thứ hai, nó sẽ hiển thị bộ điều khiển phù hợp cho một giây và sau đó màn hình chuyển sang màu trắng, nếu sau đó vuốt lại nó sẽ hiển thị như nó phải được. Nó cũng có 4 trang thay vì 3 trang dự định của tôi.UIPageViewController trang thứ hai và thứ ba nhấp nháy trắng

Dưới đây là một đoạn video để chứng minh vấn đề: https://streamable.com/i1inq

Các chỉ mục là như sau:

profileController.index = 0 
discoverController.index = 1 
matchController.index = 2 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
{ 
    if index == 0 
    { 
     index = discoverController.index 
     return discoverController 
    } 
    else if index == 1 
    { 
     index = matchController.index 
     return matchController 
    } 

    return nil 
} 

EDIT: Tôi cũng nên đề cập đến rằng bộ điều khiển ban đầu là profileController, và do đó chỉ số bắt đầu tại 0 khi ứng dụng được chạy.

+0

bạn có thể vui lòng sử dụng scrollview với phân trang hay không. Tôi nghĩ rằng nó rất giúp đỡ đầy đủ cho bạn. nếu không cố gắng thêm xem con của một viewcontroller khác trong parentviewcontroller. – Karthickkck

+0

Bạn sẽ chia sẻ bản demo của mình? –

+0

Không cache 'index'. User 'index' trong vc từ đối số của phương thức:' viewControllerAfter viewController: UIViewController'. – Codus

Trả lời

8

Cập nhật

Bạn chỉ có thể sửa đổi mã tùy chỉnh viewController của bạn với index tài sản:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
{ 
    let index = (viewController as? MyCustomVCWithIndexForPageViewController).index 
    if index == 0 
    { 
     index = discoverController.index 
     return discoverController 
    } 
    else if index == 1 
    { 
     index = matchController.index 
     return matchController 
    } 

    return nil 
} 

gốc

Bạn không nên tham số bộ nhớ cache liên quan đến pageviewcontroller. UIPageViewController đôi khi preload trang của bạn để có hiệu suất tốt hơn.

Ví dụ:

Bạn có 3 trang để hiển thị.

Bạn hiện đang hiển thị trang đầu tiên.

Sau đó, bạn cuộn đến chế độ xem thứ hai. viewControllerAfter được gọi với viewController của chế độ xem điều khiển đầu tiên để yêu cầu chế độ xem thứ hai.

viewControllerAfter được gọi lại với viewController của chế độ xem thứ hai để yêu cầu trình xem thứ ba (preload).

Trong trường hợp này nếu bạn chỉ mục bộ nhớ cache, nó sẽ dẫn đến kết quả không thể đoán trước.

+0

Ahh tôi hiểu, có ý nghĩa. Bạn có biết một giải pháp hoạt động không? – Elhoej

+0

Câu trả lời của Mohammadalijf sẽ hoạt động. Hoặc bạn có thể thấy câu trả lời cập nhật của tôi – Codus

4

bạn không cung cấp đủ mã để phát hiện điều đang gây ra sự cố. nhưng đây là cách tôi thường sử dụng UIPageController

class ViewController: UIViewController { 

    var pages = [UIViewController]() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // add pages to the array 
     // ... 
    } 
} 

extension ViewController: UIPageViewControllerDataSource { 

    func pageViewController(_ pageViewController: UIPageViewController, 
          viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     // find index of viewcontroller in array 
     if let index = pages.index(of: viewController) { 
      switch index { 
       // if index is last item you should return first item 
      case pages.count - 1: 
       return pages[0] 
      default: 
       // by default return next item in array 
       return pages[index + 1] 
      } 
     } 
     return nil 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, 
          viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     // find index of viewcontroller in array 
     if let index = pages.index(of: viewController) { 
      switch index { 
       // if index is 0 you should return last item in array 
      case 0: 
       return pages[pages.count - 1] 
      default: 
       // by default return previous item in array 
       return pages[index - 1] 
      } 
     } 
     return nil 
    } 
} 
Các vấn đề liên quan