在页面视图控制器中以编程方式使用情节提要中的视图控制器

Posted

技术标签:

【中文标题】在页面视图控制器中以编程方式使用情节提要中的视图控制器【英文标题】:Using View Controller from storyboard programmatically in a Page View Controller 【发布时间】:2013-03-04 21:25:36 【问题描述】:

我有一个带有情节提要的应用程序。我正在使用几个带有 segues 的视图控制器来根据所选项目从表视图中进行选择。我想要一个页面视图控制器,其中页面将是情节提要中的一个或多个视图控制器,甚至重复它们。我正在尝试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,在我的故事板中。

如何以编程方式使用情节提要中的不同视图控制器在页面视图控制器中使用?

【问题讨论】:

【参考方案1】:

如果您执行 viewController=[[Company100ViewController alloc] init] 那么是的,这不是与情节提要或 XIB 关联的控制器。要使用 XIB 加载控制器,您必须执行以下操作:

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

在情节提要中确保将视图控制器的 id 设置为 vc-identifier;您选择的任何标识符。

【讨论】:

注意:如果您的 UIPageViewController 与您的页面 UIViewControllers 在同一个故事板中,您可以简单地使用 self.storyboard 代替 UIStoryboard *sb = [UIStoryboard ...【参考方案2】:

斯威夫特 3

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

【讨论】:

【参考方案3】:

斯威夫特

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

guard let vc = storyboard?.instantiateViewController(withIdentifier: "nameVC") else 
  return

    
// add to current view
view.addSubview(vc.view)

【讨论】:

以上是关于在页面视图控制器中以编程方式使用情节提要中的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式为情节提要中的子视图设置视图控制器?

在 Objective-C Xcode 5 中以编程方式创建视图

如何在没有情节提要的情况下以编程方式实例化视图控制器

在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

以编程方式设置 rootViewController 不起作用,仅在 Xcode 11 中从情节提要中选择初始视图控制器