【问题标题】:Swift - Initializing model object with properties across multiple viewsSwift - 使用跨多个视图的属性初始化模型对象
【发布时间】:2018-05-28 21:57:08
【问题描述】:

客户希望我初始化一个模型对象,但我面临的问题是我需要的属性位于五个视图控制器中。在视图控制器 1 中,我为我的对象定义了 propertyA。视图控制器 2 我定义了 propertyB,依此类推。在最终视图中,我可以看到我选择的内容的摘要,然后我最终可以创建我的对象。

在我为多个视图中的每个属性都拥有相同的可选变量的那一刻,我正在做这个非常长且效率低下的事情。任何帮助都会很棒。

【问题讨论】:

  • 我们在谈论什么样的数据?听起来您可以摆脱某种管理器类,该管理器类要么是单例,要么由某个比所有视图寿命更长的类保留,因此所有视图的视图模型都可以修改同一个实例。
  • 所有视图都需要这些属性吗?如果是这样,为什么没有基类?我发现您的问题不够具体,因此似乎与代码结构基础有关。
  • @Dare 这只是字符串、整数和双打。我将听取你对经理的建议。我可能采取的方法是尝试创建一个具有与我的模型匹配的可选属性的类,并通过单例更新它们。这行得通吗?
  • @meaning-matters 你是对的。我没有尽我所能解释它。有五个视图控制器,每个允许用户选择和定义一些数据,这些数据将用于在最终视图控制器中创建模型对象。我正在使用一个具有 UI 和 VC 布局的应用程序,它的流程非常糟糕。我首先创建了一个基类,但我的客户告诉我要使用他们已有的视图。

标签: ios swift model-view-controller properties model


【解决方案1】:

对于这种情况,您应该尝试单例模式

  1. 创建具有所有属性的类并创建其单例:

    public class Property {
        public var propertyA:AnyObject? /// define your appropriate data type
        public  var propertyB:AnyObject?
        public var propertyC:AnyObject?
        public var propertyD:AnyObject?
        public var propertyE:AnyObject?
        static let sharedInstance = Property()
    }
    
  2. 要在不同的 2 视图控制器中设置值,请遵循以下模式。在这里,我假设您可以在视图控制器中的任何位置设置属性。现在我正在考虑 viewDidLoad 你可以将值更改为视图控制器的任何部分

    class ViewController1: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            Property.sharedInstance.propertyA = "X" as AnyObject //// Value should be of same data type of propertyA
        }
    }
    
    class ViewController2: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            Property.sharedInstance.propertyB = "Y" as AnyObject //// Value should be of same data type of propertyA
        }
    }
    

  3. 最后你会得到所有分配参数的值

    print(Property.sharedInstance.propertyA)
    print(Property.sharedInstance.propertyB)
    print(Property.sharedInstance.propertyC)
    print(Property.sharedInstance.propertyD)
    print(Property.sharedInstance.propertyE)
    

【讨论】:

  • @rob 和 jeetendra 我会试一试!但我确实对 1 有疑问。使用公共类和公共变量的原因是什么?我假设单例允许有或没有公共访问的可访问性。
  • 如果您的项目有多个模块或项目依赖项,并且您想从任何其他模块(除了它自己的模块)访问,那么如果没有 public,您将无法访问类及其属性。如果项目中的单个模块不需要公共
  • 这将适用于 Single Module Project 。类属性 { var propertyA:AnyObject? var 属性 B:AnyObject? var 属性 C:AnyObject? var 属性 D:AnyObject? var propertyE:AnyObject?静态让 sharedInstance = Property() }
  • Module 表示 xcodeproj 文件和内容作为子项目
  • @Breezy - 我在这里不值得任何信任;我只编辑了答案的格式。事实上,我不提倡使用单例模型对象。单例模式超级简单,但不可扩展(类紧密耦合,编写好的测试更难,很难确定模型在哪里被修改,等等)。虽然它有点复杂,但我个人倾向于依赖注入模式。见Improving Existing Apps with Modern Best Practices
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2013-10-28
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多