【发布时间】:2014-07-03 10:21:28
【问题描述】:
我正在制作一个 iOS 应用程序,它有一个加载了默认页面的 UIPageViewController,如果还没有添加任何其他页面,并且用户可以在他通过应用程序的过程中添加页面。但是,初始视图不会随着其他视图的添加而改变。
我已经尝试了这些问题的答案:
Is it possible to Turn page programmatically in UIPageViewController?
Changing UIPageViewController's page programmatically doesn't update the UIPageControl
Removing a view controller from UIPageViewController
Refresh a UIPageViewController
它们都不适合我。在我重新加载应用程序之前,视图仍保留在初始页面,之后页面显示正常,我可以添加任意数量的页面。
这是我用于制作 PageView 和页面的代码
- (void)viewDidLoad
{
[super viewDidLoad];
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self pageControllerView] bounds]];
UIViewController *initialViewController = [self viewControllerAtIndex:0];
__block Page1ViewController *blocksafeSelf = self;
// This doesn't work either... :(
void (^completionBlock)(BOOL) = ^(BOOL finished)
{
// It seems that whenever the setViewControllers:
// method is called with "animated" set to YES, UIPageViewController precaches
// the view controllers retrieved from it's data source meaning that
// the dismissed controller might not be removed. In such a case we
// have to force it to clear the cache by initiating a non-animated
// transition.
usleep(1);
dispatch_async(dispatch_get_main_queue(), ^(){
[blocksafeSelf.pageController setViewControllers:@[initialViewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
});
};
[self.pageController setViewControllers:@[initialViewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:completionBlock];
[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];
}
- (void)reloadViews
{
[[self childViewControllers] makeObjectsPerformSelector:@selector(removeFromParentViewController)];
[[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
[self.pageController willMoveToParentViewController:nil];
[self.pageController removeFromParentViewController];
[self.pageController.view removeFromSuperview];
self.pageController = nil;
self.pageController = [[UIPageViewController alloc] init];
[self.view setNeedsDisplay];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = ((SomethingViewController *)viewController).index;
index++;
if (index >= [Settings somethings].count)
{
return nil;
}
return [self viewControllerAtIndex:index];
}
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard_iPhone"
bundle:nil];
if ([Settings somethings].count == 0 && index == 0)
{
NoSomethingViewController *vc = [sb instantiateViewControllerWithIdentifier:@"NoSomethingViewController"];
vc.index = index;
return vc;
}
SomethingViewController *childViewController = [sb instantiateViewControllerWithIdentifier:@"SomethingViewController"];
childViewController.something = [[Settings somethings] somethingAtIndex:index];
childViewController.index = index;
return childViewController;
}
当应该创建一个新页面时,通过在somethings 数组中添加一个something,我从添加something 的视图控制器调用reloadViews。然后代码会到达viewControllerAtIndex 的第二部分,但这并没有显示在我在手机上看到的页面上,因为我仍然看到 NoSomethingViewController 和它的视图。
如果您需要更多代码,我会提供。
【问题讨论】:
-
你想做什么?您正在尝试滚动并且 UIPageIndicator 页面没有更改,或者您尝试在 UIPageViewController 加载页面后添加额外页面?
-
当我添加
something时,我正在尝试重新加载页面视图控制器以显示不同的页面 -
我不认为您可以在加载页面视图控制器后重新加载它。您可以做的一件事是,如果某些事情发生了变化,则从超级视图中删除页面视图控制器并再次添加它,以便在某些事情发生变化时加载动态页面。
-
我在
viewDidLoad方法的开头做。如果页面控制器已经存在,将其移除;重新创建它。它什么也没做。 -
是的,但是当您当时必须在页面视图控制器中添加新页面时,也将其从超级视图中删除并再次添加页面视图控制器,通过这样做 pageviewController 委托将被再次调用并在 pageviewcontroller 编号的页面将自动刷新。