2017-05-07 6 views
0

페이지 뷰 컨트롤러 내에 포함 된 3 개의 뷰가있는 시작 장면을 만들려고했습니다. 목표는 Instagram과 같은 것을 만드는 것이 었습니다. 중간에 소셜 미디어 피드가있는 경우 오른쪽으로 스 와이프하면보기로 이동하고 왼쪽으로 스 와이프하면 다른보기로 이동합니다. 그러나 현재 코드를 사용하면 뷰 컨트롤러가 무한히 스 와이프하고 누군가가이를 수정하는 방법을 알고 있는지 궁금해하고있었습니다. 여기페이지 뷰 컨트롤러 설정을위한 무한 루프 제거

내 현재 설정이 모습입니다 : 여기 What I want the functionality to be

내 페이지 뷰 컨트롤러 코드는 다음과 같습니다 여기 Current Setup of Page Views

내가 그것을 같이하는 방법입니다. 나는 다른 2 개의 전망을 연결하는 메인 페이지 전망 관제사가있다.

class HomeRootPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    lazy var viewControllerArray: [UIViewController] = { 
     return [self.ViewControllerInstance(name: "FeedViewController"), 
       self.ViewControllerInstance(name: "DMViewController"), 
       self.ViewControllerInstance(name: "ProfileViewController")] 
    }() 

    private func ViewControllerInstance(name: String) -> UIViewController { 
     return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name) 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.dataSource = self 
     self.delegate = self 

     if let firstViewController = viewControllerArray.first { 
      setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil) 
     } 
    } 


    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

     guard let viewControllerIndex = viewControllerArray.index(of: viewController) else { 
      return nil 
     } 

     let previousIndex = viewControllerIndex - 1 

     guard previousIndex >= 0 else { 
      return viewControllerArray.last 
     } 

     guard viewControllerArray.count > previousIndex else { 
      return nil 
     } 

     return viewControllerArray[previousIndex] 

    } 

    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

     guard let viewControllerIndex = viewControllerArray.index(of: viewController) else { 
      return nil 
     } 

     let nextIndex = viewControllerIndex + 1 

     guard nextIndex < viewControllerArray.count else { 
      return viewControllerArray.first 
     } 

     guard viewControllerArray.count > nextIndex else { 
      return nil 
     } 

     return viewControllerArray[nextIndex] 

    } 

} 

아무 도움이됩니다.

답변

0

제거하기 :

guard previousIndex >= 0 else { 
    return viewControllerArray.last 
} 

그리고이 :

guard nextIndex < viewControllerArray.count else { 
    return viewControllerArray.first 
} 

코드의 그 2 블록이, 당신의 viewControllers을 반복 할 책임이 있습니다. 단순히 제거하면 찾고있는 결과를 얻을 수 있습니다.

+0

이 줄에서 충돌이 발생합니다. return viewControllerArray [previousIndex]. 오류 : 치명적인 오류 : 색인이 범위를 벗어났습니다. –

+0

아마 viewControllerArray.last 및 viewControllerArray.first 위치를 뒤집을 수 있습니다. 인덱스가 0보다 작 으면 마지막 페이지가 아닌 첫 페이지를 표시합니다. – Nitrousjp

+0

또는 그냥 nil을 반환합니다. – Nitrousjp