2014-11-21 5 views
0

보여주는 개체의 인덱스를 반환하는 다른 요소를 기반으로 ViewController으로 이동할 뷰를 만들려고합니다.다른 ViewController를 표시하는 PageViewController를 얻는 방법

특정 ViewController를 한 번 보여줄 수는 있지만, 다시 돌아올 때는 화면에 어떤 인덱스가 있더라도 항상 ViewController이됩니다.

PageViewController I 설정 ViewDidLoad에서과에 하위 뷰로 iCarousel을 추가 app design

여기 내 코드입니다. 여기

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:nil]; 

self.pageViewController.dataSource = self; 
[[self.pageViewController view] setFrame:[[self view] bounds]]; 

_controller1 = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
_controller2 = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"]; 
_controller3 = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 

self.viewControllers = [NSArray arrayWithObjects:_controller1, nil]; 

[self.pageViewController setViewControllers:self.viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

[self addChildViewController:self.pageViewController]; 
[self.view addSubview:self.pageViewController.view]; 
[self.pageViewController didMoveToParentViewController:self]; 
[self.view addSubview:_carousel]; 

그리고

는 사용자가보기를 위로 끌어 때 화면에 표시해야하는 ViewController 제어하는 ​​코드입니다.
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    if (self.pageViewController.viewControllers[0] == self.controller2) 
     return self.controller1; 
    return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    if (self.pageViewController.viewControllers[0] == self.controller1) { 
     if ([self.carousel currentItemIndex] == 2) { 
      NSLog(@"Giving view %d", [self.carousel currentItemIndex]); 

      return self.controller2; 

     } else if ([self.carousel currentItemIndex] == 3) { 
      NSLog(@"Giving view %d", [self.carousel currentItemIndex]); 

      return self.controller3; 
     } 

    } 
    return nil; 
} 

내가 어떻게 든 ViewController를 뽑아 파괴해야합니까, 또는이는 UIPageViewController으로도 가능하다?

감사합니다.

편집 : 내가 그들로 전환 할 때 ViewControllers의 인스턴스를 시도 :

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 

    if ([self.carousel currentItemIndex] == 2) { 
     NSLog(@"load first vc %d", [self.carousel currentItemIndex]); 
     FirstViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"]; 
     return secondVC; 
    } else if ([self.carousel currentItemIndex] == 3) { 
     NSLog(@"load third vc 2 %d", [self.carousel currentItemIndex]); 
     SecondViewController *thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
     return thirdVC; 
    } 
    return nil; 
} 

를이 방법이 제대로 작동했지만 권리 View 여전히로드처럼 내가 로그 메시지를보고 있어요 오직 처음으로. 또한 처음으로 SecondViewController 또는 ThirdViewController으로 전환하면 로그 메시지가 두 번 표시됩니다.

편집 :ViewController을 계속로드하면서 계속 스크롤하면서 계속 스크롤 할 수 있다는 것을 알게되었습니다. 따라서 iCarousel을 색인 2로 스크롤하고 View을 가져 오면 나는 이전의보기를 얻습니다. 그러나 다시 "당겨"면 나는 올바른 것을 얻습니다.

나는 아주 가깝다고 느낀다. 그러나 내가 놓친 작은 것은 무엇인가?

최종 편집 :

좋아 분명히 내 코드는 처음부터 정확했다. UIPageViewControllerTransitionStyleScroll의 버그에 대한 토론은 someand some more입니다. 그래서 간단하게 전환을 컬 (curl)로 바꾸는 것은 내가하려고했던 것을했습니다.

만약 누군가가 내가 어떻게 구현할 것인지 대답 할 수 있다면이 것이 the suggested answer이 될 것입니다.

답변

0

방법의 하나는 특정에 UIPageView을 변경하기 위해 사용하는 것입니다 :

- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion; 

특정의 ViewController를 설정하려면이 방법을 캡슐화하고 인덱스에서의 ViewController를 얻는 방법을 만들어야합니다. 이렇게하려면 뷰 컨트롤러를 배열에 배치해야합니다. 따라서이 메서드를 사용하여 뷰 컨트롤러를 참조 할 수 있습니다.

-(void)setView:(NSUInteger)index {  
    // create a view controller 
    UIViewController *startingViewController = (UIViewController *)[self.arrayOfViewControllers objectAtIndex:index]; 
    // place it in an array 
    NSArray *viewControllers = @[startingViewController]; 
    // Above method 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil]; 
} 
+0

약간 손실되었습니다. 내가 정확히 이것을 어떻게 사용하겠습니까? 그 메소드를'UIPageViewControllerDataSource' 메소드 내에서 사용합니까? – Pahnev

+0

필요할 때마다 setViewController를 사용할 수 있습니다. – Rollo

관련 문제