有没有办法覆盖 UIPageViewControllerDataSource 中的 viewControllerBefore / After 方法以避免重复代码?

Posted

技术标签:

【中文标题】有没有办法覆盖 UIPageViewControllerDataSource 中的 viewControllerBefore / After 方法以避免重复代码?【英文标题】:Is there a way to override the viewControllerBefore / After methods in UIPageViewControllerDataSource to avoid repeating code? 【发布时间】:2020-05-05 18:55:06 【问题描述】:

我在整个应用程序中创建了多个 PageViewController,它们都需要一些相同的配置,所以我想知道是否有办法覆盖这些方法或以更简洁的方式执行此操作。

现在,对于我创建的 4 个中的每一个,我都有以下设置代码。 唯一的变量是viewControllers数组(在PageViewController类中声明),否则这段代码要重复4次。

extension ThemeSelector: UIPageViewControllerDataSource 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
    guard let currentIndex = themes.firstIndex(of: viewController) else  return nil 

    // This is used to prevent the pageViewController from trying to instantiate a vc before that doesn't exist.
    if currentIndex > 0  return themes[currentIndex - 1] 
    else  return nil 


func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
    guard let currentIndex = themes.firstIndex(of: viewController) else  return nil 

    // This is used to prevent the pageViewController from trying to instantiate a vc after that doesn't exist.
    if currentIndex < themes.count - 1  return themes[currentIndex + 1] 
    else  return nil



// MARK: Pagination Dots
func presentationCount(for _: UIPageViewController) -> Int 
    return themes.count


func presentationIndex(for _: UIPageViewController) -> Int 
    guard let firstViewController = viewControllers?.first,
        let firstViewControllerIndex = themes.firstIndex(of: firstViewController) else 
            return 0
    
    return firstViewControllerIndex



提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用此设置代码创建 BasePageViewController 并继承。

【讨论】:

谢谢Hayk,这是一个很好的建议,解决了我的问题。 我很乐意提供帮助。

以上是关于有没有办法覆盖 UIPageViewControllerDataSource 中的 viewControllerBefore / After 方法以避免重复代码?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法覆盖 DataContractJsonSerializer 如何序列化日期?

有没有办法覆盖 dbt Cloud CI 运行的模式名称?

有没有办法只用 CSS 覆盖自动缩放图像?

有没有办法覆盖模板中的表单值?

有没有办法可以检测文本而不覆盖它?

有没有办法阻止顺风覆盖降价默认间距?