【问题标题】:Managing multiple instances of the same view controller管理同一视图控制器的多个实例
【发布时间】:2017-02-25 14:41:26
【问题描述】:

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

【问题讨论】:

    标签: swift uiviewcontroller uipageviewcontroller


    【解决方案1】:

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

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

    您需要做的就是设置一个类级变量来识别您正在实例化的控制器,并使用它来控制 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 的开关

    【讨论】:

    • 谢谢。您能否提供一个代码示例。
    • 答案已更新为上面的代码大纲
    猜你喜欢
    • 2018-03-08
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2016-05-26
    • 2023-03-12
    相关资源
    最近更新 更多