Iphone UIPageViewController:获取当前页面
在过去的几天里,我一直在努力解决这个问题,在做了这么多杂耍之后,我发现我所需要的只是数据源方法中的当前索引,以便使用当前可见的页码进行更新 我有这个Iphone UIPageViewController:获取当前页面,iphone,objective-c,ios6,Iphone,Objective C,Ios6,在过去的几天里,我一直在努力解决这个问题,在做了这么多杂耍之后,我发现我所需要的只是数据源方法中的当前索引,以便使用当前可见的页码进行更新 我有这个UIPageViewControllerdatasource方法,我需要使用当前索引为委托方法previousViewControllers transitionCompleted:(BOOL)completed获取当前可见页面 - (UIViewController *)pageViewController:(UIPageViewControlle
UIPageViewController
datasource方法,我需要使用当前索引为委托方法previousViewControllers transitionCompleted:(BOOL)completed获取当前可见页面
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController {
NSString *path = [[NSBundle mainBundle] pathForResource:@"pages" ofType:@"pdf"];
NSURL *pdfurl = [NSURL fileURLWithPath:path];
PDFDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfurl);
contentViewController = [[ContentViewController alloc] initWithPDFAtPath:path];
currentIndex = [modelArray indexOfObject:[(ContentViewController *)viewController page]];
if (currentIndex == totalPages - 1) {
return nil;
}
contentViewController.page = [modelArray objectAtIndex:currentIndex + 1];
return contentViewController;
}
我对如何将当前索引语句从datasource方法写入delegate方法以更新当前可见页面感到困惑
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
if (!completed)
{
return;
}
//currentIndex = [[self.pageViewController.viewController lastObject]];
currentIndex = [self indexOfObject:contentViewController];
[self displaycurrentIndex:currentIndex];
//self.pageControl.currentPage = currentIndex;
}
如何更正此问题?看起来您应该能够通过以下方式获取当前索引:
ContentViewController *viewController = [self.pageViewController.viewControllers lastObject];
currentIndex = [modelArray indexOfObject:[viewController page]];
实现委托方法
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
NSLog(@"Current Page = %@", pageViewController.viewControllers);
UIViewController *currentView = [pageViewController.viewControllers objectAtIndex:0];
if ([currentView isKindOfClass:[FirstPageViewController class]]) {
NSLog(@"First View");
}
else if([currentView isKindOfClass:[SecondPageViewController class]]){
NSLog(@"Second View");
}
else if([currentView isKindOfClass:[ThirdViewController class]]){
NSLog(@"Third View");
}
}
//pageViewController.viewControllers始终返回当前可见视图ViewController如果您实现ModelController(如Apple示例),请使用其方法indexOfViewController
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
myDataViewController *currentView = [pageViewController.viewControllers objectAtIndex:0];
NSInteger currentIndex = [_modelController indexOfViewController:currentView];
[self displayPageNumber:currentIndex];
}
你可以试试这个。这将为您提供当前页面
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
UIViewController * viewController = [previousViewControllers lastObject];
NSUInteger previousPage = [(PageContentViewController *)viewController index];
NSUInteger currentPage = previousPage+1;
}
要获取当前索引,必须执行以下操作:
-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
NSUInteger index = [self.viewControllers indexOfObject: [pageViewController.viewControllers lastObject]];
NSLog(@"INDEX: %lu",(unsigned long)index);
}
对于swift:
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool){
let pageContentViewController = pageViewController.viewControllers![0] as! ViewController
let index = pageContentViewController.pageIndex
}
我也在努力解决这个问题,其他任何解决方案都不适合我,但最终还是能够使用委托方法解决这个问题:
在PageContentViewController.h中的第一个
添加以下属性:
@property NSUInteger pageIndex;
Second在PageContentViewController(而不是PageViewController)中创建代理协议
在PageContentViewController.h中:
@protocol PageContentDelegate <NSObject>
- (void)sendBackPageIndex:(NSUInteger)index;
@end
@interface LKFPageContentViewController : (UIViewController)
@property (weak, nonatomic) id<LKFPageContentDelegate> delegate;
....
@end
第四个,在PageViewController.m中实现委托方法
#pragma mark - PageContentView delegate methods
- (void)sendBackPageIndex:(NSUInteger)index {
//This is where you get your current page index
NSUInteger currentPageIndex = index;
}
Fifth,在PageViewController.m中,确保传递pageIndex值并设置代理
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index {
if (([self.arrayOfTitles count] == 0) || (index >= [self.arrayOfTitles count])) {
return nil;
}
// Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.pageIndex = index;
pageContentViewController.delegate = self;
return pageContentViewController
}
<>这是我如何判断当前页面索引是用户向左还是向右滑动,以及他是否在滑动过程中改变他的滑动方向手势。只需确保视图控制器中有一个pageIndex属性来存储索引:
func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
let currentPageIndex = (pendingViewControllers.last! as! ViewController).pageIndex!
}
我已经这样解决了这个问题:
*父视图控制器(PageViewController)*
@interface MyParentPageViewController () <UIPageViewControllerDataSource>
@property (nonatomic, assign) NSUInteger currentPageIndex;
@end
@implementation MyParentPageViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MyChildViewController *rootChildViewController = [MyChildViewController controllerWithPageIndex:self.currentPageIndex];
[self setViewControllers:@[rootChildViewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES completion:nil];
self.dataSource = self;
}
#pragma mark - Page View Controller DataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(MyChildViewController *)viewController
{
if (viewController.pageIndex == self.sourceArray.count - 1) {
return nil;
}
MyChildViewController *vc = [MyChildViewController controllerWithPageIndex:viewController.pageIndex + 1];
return vc;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(CHHomeDetailTableController *)viewController
{
if (viewController.pageIndex == 0) {
return nil;
}
MyChilViewController *vc = [MyChildViewController controllerWithPageIndex:viewController.pageIndex - 1];
return vc;
}
@end
@implementation MyChildViewController
- (void)viewWillAppear
{
MyParentPageViewController *parentPageViewController = (MyParentPageViewController *)self.parentViewController;
parentViewController.currentPageIndex = self.pageIndex;
}
@end
例如,当您向右滑动时,parentPageViewController的currentPageIndex为10或其他一些值,parentViewController.currentPageIndex将为9,如果为0,则无任何变化;如果向左滑动,parentPageViewController.currentPageIndex将为11,如果显示的controller.view是最后一个,则也不会发生任何事情 我在pageViewController上面临同样的问题,每次我滑动pageViewController时,它都会调用我的代理两次,但都找不到问题。而且我的数组是动态的,所以我希望从pageController获得正确的索引值。首先,设置pageViewController的委托。例如:
self.pageViewController.delegate = self;
然后将此委托方法添加到类中
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed) {
NSInteger currentIndex = ((PageContentViewController *)self.pageViewController.viewControllers.firstObject).pageIndex;
NSLog(@"%ld",(long)currentIndex);
}
}
PageContentViewController是显示pageViewController数据的类
运行您的项目,如果一切正常,您将获得索引值。
PageIndex是获取当前索引的整数值。希望它能帮助你
谢谢
Mandeep Singh没有很好的方法可以做到这一点,但我认为最可靠的方法是观察UIPageViewControllerDelegate
调用:
var index: Int
var proposedViewController: UIViewController?
// MARK: UIPageViewControllerDelegate
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard let proposedViewController = proposedViewController,
let index = myViewControllers?.index(of: proposedViewController) else {
return
}
self.index = index
}
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard pendingViewControllers.count == 1,
let proposedViewController = pendingViewControllers.first else {
return
}
self.proposedViewController = proposedViewController
}
我的方法很简单:
当页面(控制器)被实例化时,我在页面索引中传递,此时已知
然后在下面的委托调用中,如果转换完成,我将获取当前显示的控制器,并将其转换到我的自定义页面类中,然后使用关联的页面索引获取并更新当前页面
为了简单起见,我将数据源和委托设置为嵌入页面视图控制器的WalkThroughController
extension WalkThroughController: UIPageViewControllerDelegate {
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard finished, let currentPageController = pageViewController.viewControllers?.last as? WalkThroughPageViewController else {
return
}
self.currentPage = currentPageController.pageIndex
}
}
要点是在数据源中创建页面时设置页面的页面索引。使用这种方法,以后检索它是非常直接的。我这样写过,但获取解析问题需要标识符currentIndex=[modelArray indexOfObject:[ContentViewController*)viewController页面]];粘贴的代码段丢失<代码>(
在cast.not working中,但尝试了这个currentIndex=contentViewController.page;但是得到了20中的1,翻页时显示128393777/20,您需要显示代码和页面的定义以及您的源数组。如果我尝试您的答案,然后得到20中的1,那么翻页后-2147483648/20I不需要知道谁对此投了赞成票,但我认为这不是正确的解决方案。在我的情况下我该怎么办,因为我有12页,并且我正在加载同一个视图控制器和不同的数据。嘿,你可以使用标记来区分视图控制器。如果你正在重用controllerCool解决方案,这并不能解决问题。在任何情况下都有效。你能吗解释代码的第二行?当用户回扫时,您将不会有“ViewController”类型的当前indexValue没有成员“pageIndex”,当用户回扫时,这将在当前页面不应该是最佳且非常简单的决定时增加当前页面,这正好起作用。
extension WalkThroughController: UIPageViewControllerDelegate {
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard finished, let currentPageController = pageViewController.viewControllers?.last as? WalkThroughPageViewController else {
return
}
self.currentPage = currentPageController.pageIndex
}
}