24

I have an app with a storyboard. I am using several View Controller with segues to choose from a table view depending on the item selected. I want to have a page view controller in which the pages will be one or more view controller from the storyboard, even repeating them. I am trying to init the Page View Controller like this: .... self.dataSource=self;

UIViewController *initialViewController =[self viewControllerAtIndex:current];
NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];


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

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
{
if ((descriptions.count == 0) ||
    (index >= descriptions.count)) {
    return nil;
}

current=index;

// Create a new view controller and pass suitable data.
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

Description *description=[DBCompany getDescriptionById:language descriptionId:[[descriptions objectAtIndex:index] integerValue]];

UIViewController *viewController=nil;
if(description.frame==100){
    viewController=[[Company100ViewController alloc] init];
    ((Company100ViewController*)viewController).companyId = companyId;
}
return viewController;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if ((descriptions.count == 0) ||
    (current-1 < 0)) {
    return nil;
}

return [self viewControllerAtIndex:current-1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ((descriptions.count == 0) ||
    (current >= descriptions.count)) {
    return nil;
}

return [self viewControllerAtIndex:current+1];
}

However the viewcontroller appears in black. I think is because I am adding the UIviewcontroller class but not connecting it to any view, XIB, in my case with the storyboard.

How can I use the different view controller from the storyboard programmatically to use in a page view controller?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Laure_f_o
  • 628
  • 1
  • 7
  • 15

3 Answers3

59

If you do viewController=[[Company100ViewController alloc] init] then yes this not a controller that is associated to a storyboard or an XIB. To load the controller with an XIB you have to do the following:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
Company100ViewController * vc = (Company100ViewController *)[sb instantiateViewControllerWithIdentifier:@"vc-identifier"];

In the storyboard make sure you set the view controller's id to vc-identifier; whatever identifier you choose.

Rudy
  • 939
  • 9
  • 6
  • 12
    Note: If your UIPageViewController is in the same storyboard as your page UIViewControllers, you can simply use self.storyboard instead of UIStoryboard *sb = [UIStoryboard ... – Matt Becker Mar 15 '13 at 16:05
7

Swift 3

let sb = UIStoryboard(name: "MainStoryboard", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "vc-identifier")
Ivan Skrobot
  • 311
  • 3
  • 7
1

Swift

In case you want to init from a UIViewController object.

guard let vc = storyboard?.instantiateViewController(withIdentifier: "nameVC") else {
  return
}
    
// add to current view
view.addSubview(vc.view)
craft
  • 2,017
  • 1
  • 21
  • 30
dimpiax
  • 12,093
  • 5
  • 62
  • 45