首页 > 解决方案 > 如何将 Kotlin 中的抽象片段复制到 Swift 中的视图控制器

问题描述

我正在实现现有 Kotlin Android 应用的 iOS 版本。我正在重现的特定功能是分步向导工作流程。

我是如何在 Android 中做到的

在 Android 中,我使用的库有以下过程:

我最终创建了一个Fragment为方法提供默认实现的抽象类型Step

abstract class StepFragment(private val index: Int) : Fragment(), Step {
    ...overriding some methods from Fragment
    ...implementing methods from Step
}

每一步都Fragment继承这个类,将硬编码传递给index'StepFragment的构造函数。这些步骤可能会覆盖 中的一些方法StepFragment,其中一些也调用超类的实现(我使用@CallSuper注释来促进这一点)。实例化并返回这些片段中的StepAdapter每一个。

我如何尝试在 iOS 中做到这一点

回到 iOS/Swift 世界,我发现了一个类似的库,但它提供的只是进度条的视图。它不像 Android 那样处理实例化和显示每个步骤的内容。我需要自己处理。

但是,您可以为步进器提供一个委托,允许您连接到转换(willSelectIndex、didSelectIndex、canSelectIndex 等)。我将根ViewController设置为步进器的代表。这ViewController在顶部有进度条视图,在进度条下方有一个用于每个步骤的容器。每个步骤ViewController都嵌入到相应的容器中。为了控制步骤之间的转换,我简单地显示和隐藏这些容器视图。我已经弄清楚了那部分。

我没有想到的是如何将StepFragment类从 Android复制Fragment到 SwiftViewController中。我有以下问题:

我可以通过以下几种方式解决这些问题:

TL;博士

总结一下我的问题,我正在寻找一种方法让多个“步骤” childViewController连接到由 parent 控制的向导工作流程中ViewController。他们应该能够在步骤选择、转换之前甚至块转换上执行一些(可能是异步的)逻辑。我必须能够选择性地忽略其中一些钩子,然后它们应该使用默认实现。

标签: iosswiftmobile

解决方案


我发现您实际上可以为协议功能提供默认实现,所以这是我的解决方案:

protocol StepViewController: UIViewController {
    var stepIndex: Int { get }

    func onBackClicked(_ goToPreviousStep: () -> Void)

    ...
}

extension StepViewController {
    // this is a default implementation, so implementors don't have to provide it
    func onBackClicked(_ goToPreviousStep: () -> Void) {
        goToPreviousStep()
    }

    ...
}

class StepOneViewController: UIViewController, StepViewController {
    let stepIndex: Int = 0

    func onBackClicked(_ goToPreviousStep: () -> Void) {
        // if I want to call the default implementation I can do this:
        (self as StepViewController).onBackClicked(goToPreviousStep)
    }
}

推荐阅读