IOS - 如何从不同的XIB文件创建具有多个ViewController的UIPageViewController

时间:2015-03-03 09:48:30

标签: ios xcode swift uiviewcontroller uipageviewcontroller

我的主控制器有一个UIPageViewController。我想浏览不同结构化的视图,因此我无法使用相同的控制器。另外,我不想污染主要故事板。我想拥有自定义控制器的不同XIB文件。到现在为止还挺好。

我希望能够为UIPageViewController提供索引。

This回答显示了如何使用多个视图控制器,但它们都在故事板中。

我尝试过同样的方法。我用相应的ViewControllers创建了我的XIB。为了向PageViewController提供索引,我尝试将RestorationId设置为视图以便稍后在代码中访问。 在PageViewController中,我构建了这样的控制器:

func viewControllerAtIndex(index: Int) -> UIViewController {
    let vc = UIViewController(nibName: controllersNames[index], bundle: nil)
    ...
}

但如果我这样做

vc.restorationIdentifier

我没有......

所以我似乎无法找到一种方法将控制器绑定到我需要提供UIPageViewController的索引。

请帮忙。

1 个答案:

答案 0 :(得分:2)

您需要像主视图控制器一样创建,并在此视图控制器中初始化所需的所有VC。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        // initialize controllers
        self.controllers = [[NSMutableArray alloc]
                            initWithObjects:
                            [[Document1ViewController alloc] initWithNibName:@"Document1ViewController" bundle:nil],
                            [[Document2ViewController alloc] initWithNibName:@"Document2ViewController" bundle:nil],
                            [[Document3ViewController alloc] initWithNibName:@"Document3ViewController" bundle:nil],
                            nil];
    }
    return self;
}

然后,您需要创建一个滚动视图,其中包含您想要的VC编号。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    for (NSUInteger i =0; i < [self.controllers count]; i++) {
        [self loadScrollViewWithPage:i];
    }

    self.pageControl.currentPage = 0;
    _page = 0;
    [self.pageControl setNumberOfPages:[self.controllers count]];

    UIViewController *viewController = [self.controllers objectAtIndex:self.pageControl.currentPage];
    if (viewController.view.superview != nil) {
        [viewController viewWillAppear:animated];
    }

    self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [self.controllers count], scrollView.frame.size.height);
}

当您滚动时,您需要更改scrollView中的VC顺序,因为您有一个包含所有VC的引用的数组。

您可以看到一个示例here