gpt4 book ai didi

ios - UIPageViewController;如何处理动态变化的数据源

转载 作者:行者123 更新时间:2023-12-01 16:42:25 24 4
gpt4 key购买 nike

我正在创建一个动态的“wizard-isch”分步功能,基本上将引导用户通过一组 View ,其中包括带有说明和信息的静态 View ,以及需要用户干预的动态 View (填写文本字段,与后端通信等...),然后允许用户继续进行“下一个” View 。

因此,我认为 UIPageViewController 将是一个不错的方法,最初只设置一个启动 View Controller 来表示“欢迎”;

[self setViewControllers:@[welcomeViewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];

然后使用 UIPageViewControllerDataSource动态获取下一个 View 。这样,我可以防止用户“走得太远”,而无需先在一个 View 上填写所需的信息,然后再允许用户滚动到下一个 View 并提供更多说明等...
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
//Check if the user has filled out everything that needs to be done

//If all is good, allow for the next view to appear
if (...)
return nextViewController;
else
return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
//Check if the user is allowed to go back to the previous view -- some views are not possible to go back to

//If all is good, allow for the previous view to appear
if (...)
return previousViewController;
else
return nil;
}

我已经构建了架构数据管理的东西来使它工作,一切都很好。但是,UIPageViewController 在我说过“不,没有上一个/下一个 View ......”的地方缓存了我的数据源答案,这意味着当用户填写了需要完成的内容并被授予继续访问权限时,刷了多少都没关系;缓存说那里没有什么可以刷到的。

因此,我需要找到一种重置缓存的方法,强制 UIPageViewController 始终询问数据源是否有可用的 View ,无论是在当前 View 之前还是之后。

我进行了一些研究,发现了一种我认为可行的好方法,方法是重新分配强制执行“缓存重置”的数据源;
//Enforce a cache reset after 1 sec
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

//Reset/reassign data source, which will cause cached data-VCs to be thrown
DDLogInfo(@"Resetting data source");
self.dataSource = nil;
self.dataSource = self;
});

但是,我找不到合适的位置来执行它,因为当数据源被重置/重新分配时,由于手势/滑动而导致的任何正在进行的动画也将被重置,这会导致 UI 很差。

我希望能够找到一个合适的位置来重置我知道没有正在进行的动画的数据源。但是代表 pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:仅在有要滚动到的 View 时才调用。而且,在我的情况下,如果用户位于当前的“最后一个” View ,则该 View 将被“拖动”,但没有可用的新 View 。

或者,另一种解决方案是在第一个/最后一个 View 中禁用 UIPageViewController 的“拖动”动画......我不知道 - 卡住并需要第二个意见;)有什么想法/建议吗?

最好的,
/马库斯

最佳答案

如果你想从 UIPageViewController 重置缓存使用这个类别
UIPageViewController+Additions.h :

@interface UIPageViewController (Additions)

- (void)setViewControllers:(NSArray *)viewControllers
direction:(UIPageViewControllerNavigationDirection)direction
invalidateCache:(BOOL)invalidateCache
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion;

@end
UIPageViewController+Additions.m
@implementation UIPageViewController (Additions)
- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction invalidateCache:(BOOL)invalidateCache animated:(BOOL)animated completion:(void (^)(BOOL finished))completion {
NSArray *vcs = viewControllers;
__weak UIPageViewController *mySelf = self;

if (invalidateCache && self.transitionStyle == UIPageViewControllerTransitionStyleScroll) {
UIViewController *neighborViewController = (direction == UIPageViewControllerNavigationDirectionForward
? [self.dataSource pageViewController:self viewControllerBeforeViewController:viewControllers[0]]
: [self.dataSource pageViewController:self viewControllerAfterViewController:viewControllers[0]]);
[self setViewControllers:@[neighborViewController] direction:direction animated:NO completion:^(BOOL finished) {
[mySelf setViewControllers:vcs direction:direction animated:animated completion:completion];
}];
}
else {
[mySelf setViewControllers:vcs direction:direction animated:animated completion:completion];
}
}
@end

关于ios - UIPageViewController;如何处理动态变化的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23085148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com