这绝对是你应该解决这个问题的方式。
即使控制器之间存在一些差异,但如果大部分功能相同,则可以使用单个类。
您需要做的就是设置一个类级变量来识别您正在实例化的控制器,并使用它来控制 tableView 数据、颜色等,
开始的一种方法是通过枚举来识别您的不同情况 - 您可以将这些常量用于 segue 标识符并跟踪演示视图控制器的每个实例
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
}
}
}
在展示视图控制器的任何地方,您需要对类型执行特定操作,只需包含基于viewID 的开关