UIPageViewController 不改变页面
Posted
技术标签:
【中文标题】UIPageViewController 不改变页面【英文标题】:UIPageViewController doesn't change page 【发布时间】:2014-01-30 23:17:01 【问题描述】:我有一个实现 UIPageViewControllerDataSource
委托的视图控制器,它包含一个 UIPageViewController。
我的问题是,经过 3 个小时的教程和阅读,我仍然不明白为什么 UIPageController 会通过移动其内容来响应滑动,但如果滚动足够,它不会改变页面。总是卡在第一页。
这是我的 .h 文件
#import <UIKit/UIKit.h>
@interface BreathePageViewController : UIViewController <UIPageViewControllerDataSource>
@property (strong, nonatomic) UIPageViewController *pageController;
@end
这是我的 .m 文件
#import "BreathePageViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h.h"
@interface BreathePageViewController ()
NSArray *pageViewControllerScreens;
FirstViewController *firstViewController;
SecondViewController *secondViewController;
int pageIndex;
@end
@implementation BreathePageViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
return self;
- (void)viewDidLoad
[super viewDidLoad];
pageIndex = 0;
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
[self.pageController setViewControllers:@[firstViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
[self.view addSubview:self.pageController.view];
[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
if (pageIndex == 0)
return nil;
pageIndex--;
return [self viewControllerAtIndex:pageIndex];
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
if (pageIndex == 2)
return nil;
pageIndex++;
return [self viewControllerAtIndex:pageIndex];
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
UIViewController *vc;
if (pageIndex == 0 )
vc = [[FirstViewController alloc] init];
else if (pageIndex == 1)
vc = [[SecondViewController alloc] init];
return vc;
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
return 2;
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
return 0;
@end
现在奇怪的是 pageViewController:viewControllerAfterViewController
从未被调用过。
有人可以帮我吗?
谢谢
【问题讨论】:
【参考方案1】:睡了一夜之后,我要回答我自己的问题了。
我不知道为什么(感谢任何评论),但问题不在那个视图控制器上,而是在我创建它的那个控制器上。
在父视图控制器中,我像这样构建 UIPageViewController:
BreathePageViewController *pageController = [[BreathePageViewController alloc] init];
[pageController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:pageController.view];
现在我尝试将 pageViewController 的声明移动为 iVar。它有效。 希望能帮助到别人
【讨论】:
如果您使用的是 ARC pageController,则本地 var 在将其视图添加到 self.view 层次结构后立即被释放。在 dealloc 过程中,委托被设置为 nil。以上是关于UIPageViewController 不改变页面的主要内容,如果未能解决你的问题,请参考以下文章
swift+UIPageViewController 纯代码实现引导页