如何通过一系列视图控制器来保持用户的选择?

时间:2011-01-21 04:36:17

标签: iphone objective-c cocoa-touch delegates uinavigationcontroller

我一直在阅读关于依赖注入的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进行显示之前。

这两个选项对我来说都很“好”,但感觉还不对。

也许我完全误解了依赖注入,在这种情况下请告诉我!否则,对上述内容的任何想法都将是巨大的。

提前谢谢!

3 个答案:

答案 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 }返回。 BB只会知道“在选择词典中选择(图片|颜色)和保存结果。”

然后在C中,viewDidAppear:有一个简单的状态机:

  • 如果未选择照片,请按A(图像选择器)
  • 如果没有选择颜色,请按B(颜色选择器)
  • 其他显示图片

答案 2 :(得分:0)

如果有人想知道同样的事情,最后我从原来的问题中选择了 1 / 。工作得很好,感觉可维护,并允许我制作非常通用和可重复使用的ViewControllers。