当最后一个视图控制器被滑动后,我该如何关闭/弹出UIPageViewController?

8

在最后一个视图控制器被滑动后,我该如何关闭/弹出UIPageViewController? 基本上想要制作一个教程样式的分页视图,其中包含图片,并在用户从最后一页向“下一页”滑动后关闭。

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

    NSUInteger index = [(EmailTutorialViewController *)viewController index];


    index++;

    if (index == 5) {
        [self.navigationController popViewControllerAnimated:YES]; // this doesn't do anything
        return nil;
    }

    return [self viewControllerAtIndex:index];
}

你可以在Stack Overflow上找到很多解决方案。请不要过度使用它。 - santhu
2
我还没有找到任何东西,这就是为什么我发帖的原因。 - ebi
[self dismissViewControllerAnimated:YES completion:nil] 或者 [self.navigationController popViewControllerAnimated:YES] - santhu
你会在哪里进行这个调用? - ebi
1
我会让它更复杂,为你的索引添加一个观察者,并在值对应于最后一个值时进行弹出 :) - Nicolas Manzini
显示剩余2条评论
2个回答

12

这是我使用过的简单解决方案:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;

中,当index == 5时返回空控制器,并添加此UIPageViewControllerDelegate方法:

- (void)pageViewController:(UIPageViewController *)pageViewController 
willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
    EmailTutorialViewController *viewController = 
                [pendingViewControllers objectAtIndex:0];
    if ([viewController index] == 5) 
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

1
不得不修改大量其他委托方法,但感谢这个起始者。 - Anton Tropashko

0

在您的UIPageViewController或符合UIPageViewControllerDelegate协议的视图控制器中:

// UIPageViewController.h
@interface UIPageViewController

@property (nonatomic, assign) NSInteger pageIndex;

@end

// UIPageViewController.m
@implementation UIPageViewController

/* ... */

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Start with animation from the presenting view/item.
    UIViewController *singlePageVC = [UIViewController viewControllerWithPageIndex:self.pageIndex];
    singlePageVC.view.alpha = 0.0f;
    if (singlePageVC != nil) {
        self.dataSource = self;
        self.delegate = self;

        // Add singlePageVC to the page view controller with the initial pageIndex.
        [self setViewControllers:@[ singlePageVC ]
                       direction:UIPageViewControllerNavigationDirectionForward
                        animated:NO
                      completion:nil];
    }
}

#pragma mark - UIPageViewControllerDelegate

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
      viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSInteger index = singlePageVC.pageIndex;
    // This will add a page before the current view controller.
    // Even if the index is 0, a new (dismissing) view controller will be added here.
    return [UIViewController viewControllerWithPageIndex:index - 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{
    NSInteger index = singlePageVC.pageIndex;
    // This will add a page after the current view controller.
    // Even if the index is at your array bounds (i.e., 5), a new (dismissing) view controller will be added here.
    return [UIViewController viewControllerWithPageIndex:index + 1];
}

/* ... */

@end

// UIViewController+PageIndex.h
extern NSString * const UIViewControllerShouldDismissFromPageViewControllerNotification;

@interface UIViewController (PageIndex)

@property (nonatomic, assign) NSInteger pageIndex;

- (instancetype)initWithPageIndex:(NSInteger)pageIndex;
+ (instancetype)viewControllerWithPageIndex:(NSInteger)pageIndex;

@end

// UIViewController+PageIndex.m
NSString * const UIViewControllerShouldDismissFromPageViewControllerNotification = @"UIViewControllerShouldDismissFromPageViewControllerNotification";

@implementation UIViewController (PageIndex)

// Initialize with the current item's index.
- (instancetype)initWithPageIndex:(NSInteger)pageIndex
{
    self = [super init];
    if (self) {
        _pageIndex = pageIndex;
    }
    return self;
}

+ (instancetype)viewControllerWithPageIndex:(NSInteger)pageIndex
{
    return [[self alloc] initWithPageIndex:pageIndex];
}

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

    // Check for pageIndex out of bounds of your array.
    // This will be either less than 0 or greater or equal to your array count.
    if (self.pageIndex < 0 || self.pageIndex >= array.count) { // Replace with your global or passed array here.
        // Post dismiss notification here.
        [[NSNotificationCenter defaultCenter]
        postNotificationName:UIViewControllerShouldDismissFromPageViewControllerNotification
        object:nil];
        return;
    }
}

@end

// View controller than manages your UIPageViewController.

@implementation YourViewController

/* ... */

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter]
    addObserver:self selector:@selector(dismissPageViewController:)
    name:UIViewControllerShouldDismissFromPageViewControllerNotification
    object:nil];
}

- (void)dismissPageViewController:(NSNotification *)notification
{
    // Dismiss your page view controllers here.
    [self.pageViewController dismissViewController];
    self.pageViewController = nil;

    // Or remove the page view controllers from its parent view controller,
    [self.pageViewController willMoveToParentViewController:nil];
    [self.pageViewController removeFromParentViewController];
    [self.pageViewController didMoveToParentViewController:nil];

    // Or its view from its super view.
    [self.pageViewController.view removeFromSuperview];
    self.pageViewController = nil;
}

/* ... */

@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接