• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 UIPageViewController 中重新加载 View

[复制链接]
菜鸟教程小白 发表于 2022-12-12 10:39:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在制作一个具有 UIPageViewController 的 iOS 应用程序,如果尚未添加任何其他页面,则该 UIPageViewController 会加载默认页面,并且用户可以在通过应用程序进行时添加页面。但是,初始 View 不会随着其他 View 的添加而改变。

我尝试了以下问题的答案:
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

它们都不适合我。在我重新加载应用程序之前, View 仍保留在初始页面,之后页面显示正常,我可以添加任意数量的页面。

这是我用于制作 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] makeObjectsPerformSelectorselector(removeFromParentViewController)];
    [[self.view subviews] makeObjectsPerformSelectorselector(removeFromSuperview)];

    [self.pageController willMoveToParentViewController:nil];
    [self.pageController removeFromParentViewController];
    [self.pageController.view removeFromSuperview];
    self.pageController = nil;
    self.pageController = [[UIPageViewController alloc] init];

    [self.view setNeedsDisplay];
}

- (UIViewController *)pageViewControllerUIPageViewController *)pageViewController viewControllerAfterViewControllerUIViewController *)viewController
{
    NSUInteger index = ((SomethingViewController *)viewController).index;
    index++;

    if (index >= [Settings somethings].count)
    {
        return nil;
    }

    return [self viewControllerAtIndex:index];
}

- (UIViewController *)viewControllerAtIndexNSUInteger)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,我从添加 的 View Controller 调用 reloadViews一些东西。然后代码会到达 viewControllerAtIndex 的第二部分,但这并没有显示在我在手机上看到的页面上,因为我仍然看到 NoSomethingViewController 和它的 View 。

如果您需要更多代码,我会提供。



Best Answer-推荐答案


在pageViewController viewWillAppear方法中添加如下代码

数据源 = self

并在 View 中添加WillDisappear

数据源 = 无

这将强制 pageViewController 重新加载其数据源

关于ios - 在 UIPageViewController 中重新加载 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551073/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap