IOS - 如何使用来自不同 XIB 文件的多个 ViewController 创建一个 UIPageViewController
IOS - How to create a UIPageViewController with multiple ViewController from different XIB files
我的主控制器有一个 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 的索引的方法。
请帮忙。
您需要像创建主视图控制器一样创建,并在此视图控制器中初始化您需要的所有 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);
}
当您滚动时,您需要更改滚动视图中的 VC 顺序,这是可能的,因为您有一个包含所有 VC 的引用的数组。
你可以看到一个例子here
我的主控制器有一个 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 的索引的方法。
请帮忙。
您需要像创建主视图控制器一样创建,并在此视图控制器中初始化您需要的所有 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);
}
当您滚动时,您需要更改滚动视图中的 VC 顺序,这是可能的,因为您有一个包含所有 VC 的引用的数组。
你可以看到一个例子here