我一直在阅读关于依赖注入的StackOverflow上的this帖子,我非常希望使用最受好评的答案给出的想法。但是,我无法将它们扩展到我的工作中,并且到处寻找解决方案但没有运气。
用最简单的术语来说明我的情况,假设我有:
ViewController A - 用户在其中选择照片
ViewController B - 然后用户选择颜色
ViewController C - 将图像和颜色显示给用户
我可以看到如何使用依赖注入来指定一旦选择了照片,ViewController A应该将ViewController B推送到导航控制器,但是我应该在哪里存储所选择的照片?我应该如何使它可供ViewController C显示?
另外,我应该如何判断ViewController B是否需要在选择颜色时推送ViewController C?
我能想到的唯一一个严格遵循上述主题思路的解决方案是在ViewController B上有一个'photo'属性,当它被推送到导航控制器时由ViewController A设置。但这对我来说似乎是一个“坏主意”,因为一般来说ViewController B应该对照片不感兴趣,因为它的唯一目的就是选择颜色并继续前进。
在尝试解决这个问题时,我想出了两种可能性:
1 /将所有ViewControllers报告回中央代表。
这似乎是依赖于依赖注入线程所说的内容,但它似乎仍然是最简单的方法。即ViewController A选择一张照片并告诉代表。代理人将照片存储起来供以后使用,并将ViewController B推送到导航控制器。当选择一种颜色时,它会存储它并推送ViewController C,并传递它之前存储的颜色和照片的值。
2 /在控制器之间传递某种属性对象。
我可以使用'color'和'photo'属性创建一个对象并将其传递给ViewController A.将在ViewController A中设置photo属性,然后将对象传递给ViewController B,它将设置color属性在将其传递给ViewController C进行显示之前。
这两个选项对我来说都很“好”,但感觉还不对。
也许我完全误解了依赖注入,在这种情况下请告诉我!否则,对上述内容的任何想法都将是巨大的。
提前谢谢!
答案 0 :(得分:1)
我将如何做到这一点。
首先使用UINavigationController对象开始,该对象包含视图控制器A,B和C.“A”首先被推送,“B”然后是“C”。当每个视图控制器被推到视图控制器的“堆栈”上时,它们都在内存中。因此,当按下“C”时,“C”应该向UINavigationController询问“A”和“B”(照片和颜色)的属性。基本上,UINavigationController是C和其他两个控制器(A和B)之间的桥梁。
答案 1 :(得分:1)
我认为您不需要完整的链A-> B-> C。
A
可以调用B
,在init
方法中传递“选择”词典,然后在{{1}后重新获得控制权时调用C
}返回。 B
和B
只会知道“在选择词典中选择(图片|颜色)和保存结果。”
然后在C
中,viewDidAppear:
有一个简单的状态机:
A
(图像选择器)B
(颜色选择器)答案 2 :(得分:0)
如果有人想知道同样的事情,最后我从原来的问题中选择了 1 / 。工作得很好,感觉可维护,并允许我制作非常通用和可重复使用的ViewControllers。