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

时间:2017-02-25 14:41:26

标签: swift uiviewcontroller uipageviewcontroller

我正在使用UIPageViewController,它在故事板中有五个视图控制器,我为每个视图控制器创建了一个类。一切正常,但是我希望改进我的代码,因为五个视图控制器在几乎所有内容中都是相同的(它们都包含一个表视图,并且只显示它所显示的信息)。 我希望在我的页面视图控制器中有一个视图控制器,并创建该视图控制器的五个实例,而不是必须重复我的代码五次。 我知道可以使用相同的故事板标识符实例化多个视图控制器,因此创建一个视图控制器类的多个实例,但我的问题是如何管理每个实例的属性。例如,如果我需要更改表视图背景颜色? 先感谢您。 Main.storyboard

1 个答案:

答案 0 :(得分:2)

这绝对是你应该解决的问题。

即使控制器之间存在一些差异,如果大部分功能相同,那么您可以使用单个类。

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

一种方法是使用枚举来识别不同的情况 - 您可以将这些常量用于segue标识符并跟踪演示文稿的每个实例View Controller

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的表示视图控制器,该变量可用于对颜色等进行类型特定的更改,并且具有为{定义的正确数据源{1}}

然后修改您的演示文稿类以具有类似的内容

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 } } } 的开关