在页面视图控制器中以编程方式使用故事板中的视图控制器

24

我有一个带有故事板的应用程序。我正在使用多个视图控制器和转场,根据选择的项目从表格视图中选择。我想要一个页面视图控制器,其中页面将是来自故事板的一个或多个视图控制器,甚至可以重复它们。我正在尝试像这样init页面视图控制器: .... 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];
}

然而,viewcontroller 出现为黑色。我认为这是因为我添加了 UIviewcontroller 类,但没有将其连接到任何视图、XIB 或故事板中。如何在编程方式下使用来自故事板的不同视图控制器以在页面视图控制器中使用?
3个回答

59
如果你执行viewController = [[Company100ViewController alloc] init],那么这不是一个与storyboard或XIB相关联的控制器。要加载带有XIB的控制器,你需要执行以下操作:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
Company100ViewController * vc = (Company100ViewController *)[sb instantiateViewControllerWithIdentifier:@"vc-identifier"];

在Storyboard中,确保将视图控制器的ID设置为vc-identifier,无论您选择哪个标识符。

12
注意:如果您的UIPageViewController与页面的UIViewControllers在同一个故事板中,那么您可以直接使用self.storyboard而不是UIStoryboard *sb = [UIStoryboard ... - Matt Becker

7

Swift 3

let sb = UIStoryboard(name: "MainStoryboard", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "vc-identifier")

1

Swift

如果您想从UIViewController对象初始化。

guard let vc = storyboard?.instantiateViewController(withIdentifier: "nameVC") else {
  return
}
    
// add to current view
view.addSubview(vc.view)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接