2012-11-16 202 views
0

我在ipad中顯示的視圖就像一本書,單個視圖顯示兩個視圖。我想添加更多視圖,以便在查看翻轉的第三個和第四個視圖出現並進一步顯示時。我正在使用下面的代碼來這樣做。我將視圖控制器添加到數組它在定位方法在這一行殺死「ContentViewController * currentViewController = [self.pageViewController.viewControllers objectAtIndex:0];」。在頁面控制器中訪問多個視圖控制器

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

//Instantiate the model array 
self.modelArray = [[NSMutableArray alloc] init]; 
for (int index = 1; index <= 12 ; index++) 
{ 
    [self.modelArray addObject:[NSString stringWithFormat:@"Page %d",index]]; 
} 

//Step 1 
//Instantiate the UIPageViewController. 
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl 
                  navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

//Step 2: 
//Assign the delegate and datasource as self. 
self.pageViewController.delegate = self; 
self.pageViewController.dataSource = self; 

//Step 3: 
//Set the initial view controllers. 

ViewOne *one = [[ViewOne alloc]initWithNibName:@"ViewOne" bundle:nil]; 
viewTwo *two = [[viewTwo alloc]initWithNibName:@"ViewTwo" bundle:nil]; 

ContentViewController *contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil]; 
contentViewController.labelContents = [self.modelArray objectAtIndex:0]; 

// NSArray *viewControllers = [NSArray arrayWithObject:contentViewController]; 
viewControllers = [NSArray arrayWithObjects:contentViewController,one,two,nil]; 

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



//Step 4: 
//ViewController containment steps 
//Add the pageViewController as the childViewController 
[self addChildViewController:self.pageViewController]; 

//Add the view of the pageViewController to the current view 
[self.view addSubview:self.pageViewController.view]; 

//Call didMoveToParentViewController: of the childViewController, the UIPageViewController instance in our case. 
[self.pageViewController didMoveToParentViewController:self];  

//Step 5: 
// set the pageViewController's frame as an inset rect. 
CGRect pageViewRect = self.view.bounds; 
pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0); 
self.pageViewController.view.frame = pageViewRect; 

//Step 6: 
//Assign the gestureRecognizers property of our pageViewController to our view's gestureRecognizers property. 
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; 

} 

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController 
       spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
{ 
if(UIInterfaceOrientationIsPortrait(orientation)) 
{ 
    //Set the array with only 1 view controller 
    UIViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0]; 
    NSArray *viewControllers = [NSArray arrayWithObject:currentViewController]; 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; 

    //Important- Set the doubleSided property to NO. 
    self.pageViewController.doubleSided = NO; 
    //Return the spine location 
    return UIPageViewControllerSpineLocationMin; 
} 
else 
{ 


    // NSArray *viewControllers = nil; 

    ContentViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0]; 

    NSUInteger currentIndex = [self.modelArray indexOfObject:[(ContentViewController *)currentViewController labelContents]]; 
    if(currentIndex == 0 || currentIndex %2 == 0) 
    { 
     UIViewController *nextViewController = [self pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController]; 
     viewControllers = [NSArray arrayWithObjects:currentViewController, nextViewController, nil]; 
    } 
    else 
    { 
     UIViewController *previousViewController = [self pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController]; 
     viewControllers = [NSArray arrayWithObjects:previousViewController, currentViewController, nil]; 
    } 
    //Now, set the viewControllers property of UIPageViewController 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; 

    return UIPageViewControllerSpineLocationMid; 
} 
} 

回答

0

你不能和你在一開始要的所有視圖控制器設置UIPageViewControllerviewControllers財產。

您必須爲數據源實現以下方法:- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController。這提供了視圖控制器在更改頁面時顯示。當沒有更多頁面顯示時,您必須返回零。

因此,如果您在viewDidLoad上設置了viewControllers屬性和3個元素,您實際上應該只設置它們兩個,因爲您只允許一次顯示兩個頁面。

+0

我在initWithViewControllers方法初始化它從委託調用後,它進入viewDidLoad,所以當我嘗試通過調用上面定義的方法移動到下一個視圖控制器數組不會初始化。請檢查此鏈接「http://stackoverflow.com/questions/13875151/array-value-not-retrieving-outside-method-initwithviewcontrollers」 –

相關問題