Swift 管理同一视图控制器的多个实例

Swift 管理同一视图控制器的多个实例,swift,uiviewcontroller,uipageviewcontroller,Swift,Uiviewcontroller,Uipageviewcontroller,我正在使用一个UIPageViewController,它在情节提要中有五个视图控制器,我为每个视图控制器创建了一个类。这一切都很好,但是我希望改进我的代码,因为这五个视图控制器几乎在所有方面都是相同的(它们都包含一个表视图,并且只在它显示的信息上有所不同)。 我希望在我的页面视图控制器中有一个视图控制器,并创建该视图控制器的五个实例,而不必重复我的代码五次。 我知道可以用相同的情节提要标识符实例化多个视图控制器,从而创建一个视图控制器类的多个实例,但我的问题是如何管理每个实例的属性。例如,如果

我正在使用一个
UIPageViewController
,它在情节提要中有五个视图控制器,我为每个视图控制器创建了一个类。这一切都很好,但是我希望改进我的代码,因为这五个视图控制器几乎在所有方面都是相同的(它们都包含一个表视图,并且只在它显示的信息上有所不同)。 我希望在我的页面视图控制器中有一个视图控制器,并创建该视图控制器的五个实例,而不必重复我的代码五次。 我知道可以用相同的情节提要标识符实例化多个视图控制器,从而创建一个视图控制器类的多个实例,但我的问题是如何管理每个实例的属性。例如,如果我需要更改表格视图背景颜色? 先谢谢你。

这绝对是你应该解决这个问题的方式

即使控制器之间存在一些差异,但如果大多数功能相同,则可以使用单个类

您需要做的就是设置一个类级变量来标识您正在实例化的控制器,并使用它来控制tableView数据、颜色等

一种开始的方法是使用枚举来识别不同的情况,您可以使用这些常量作为序列标识符,并跟踪表示视图控制器的每个实例

enum ViewControllerType : String
{
    case controllerType1 = "Controller1"
    case controllerType2 = "Controller2"
    case controllerType3 = "Controller3"
    case controllerType4 = "Controller4"
    case controllerType5 = "Controller5"
}
然后,使用
prepare(forSegue
方法

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    switch segue.identifier!
    {
    case ViewControllerType.controllerType1.rawValue:
        // standard definition
        let presentationVC : GenericViewController = segue.destination as! GenericViewController
        presentationVC.viewID = .dayView = ViewControllerType.controllerType1.rawValue
        presentationVC.delegate = self
        // specific to this controller
        presentationVC.dataSource = dataSourceUsedForType1

    case ViewControllerType.controllerType2.rawValue:
        // standard definition
        let presentationVC : GenericViewController = segue.destination as! GenericViewController
        presentationVC.viewID = .dayView = ViewControllerType.controllerType2.rawValue
        presentationVC.delegate = self
        // specific to this controller
        presentationVC.dataSource = dataSourceUsedForType2

        // and so on for all cases ...

    default:
        break
    }
}
这意味着您将实例化一个演示视图控制器,该控制器具有一个变量
viewID
,可用于对颜色等进行特定类型的更改,并且具有为
UITableView定义的正确数据源

然后修改演示类,使其具有如下内容

class GenericViewController: UIViewController
{
    var viewID : String = ""

    override func viewDidLoad()
    {
        super.viewDidLoad()

        switch viewID {
        case ViewControllerType.controllerType1.rawValue:
            // make specific changes to the view and data source here
            break
        case ViewControllerType.controllerType2.rawValue:
            // make specific changes to the view and data source here
            break
        // and so on for all cases ...
        default:
            // handle default behaviour
            break
        }
    }
}

在presentation view controller中需要执行特定于该类型操作的任何位置,只需包含一个基于
viewID

的开关即可。谢谢。请提供一个代码示例。答案已更新为上面的代码大纲