在视图之间传递数据?

时间:2014-05-01 14:39:31

标签: ios objective-c ios7

不使用通知,是将数据从一个视图传递到另一个视图以使用属性并将属性分配给目标视图的viewDidLoad中的某个UI元素的正确方法吗?

例如,如果我有一个视图应用程序,那么首先会出现一个mainView。我添加了另一个ViewController(ViewTwo),它有一个标签。如果mainView尝试在prepareForSegue中为此标签分配字符串,则会因为标签未初始化而失败。首先在viewTwo上分配属性,然后分配到viewDidLoad中的UI元素。

另外,如何在不使用通知的情况下将viewTwo中的数据返回到mainView?

1 个答案:

答案 0 :(得分:1)

这可能会有所帮助:

How to pass prepareForSegue: an object

如果将对象传递给第二个视图,第一个视图也可以保留所有权并读取第二个视图消失后第二个视图所写的内容。

为了澄清(并且此代码来自上面的链接),想法是在prepareForSegue中将目标viewcontroller作为要使用的对象。例如:

// Get reference to the destination view controller
YourViewController *vc = [segue destinationViewController];

目前的视图控制器已经实例化了。但是你在pepareForSegue之前获得第二个视图控制器。事实上,viewDidLoad将在prepareForSegue之后调用。这是一个有趣的链接:viewDidLoad called before prepareForSegue finishes(只是因为链接的标题没有误导,作者同意它在viewDidLoad之前没有调用prepareForSegue

由于尚未调用viewDidLoad,但视图已初始化,程序员可以例如填充第二个视图上的实例变量NSString,在第二个视图的viewDidLoad方法中,它可以使用这些字符串设置它的标签。这是Passing Data between View Controllers

的一个很好的参考

代理和协议也在此链接中讨论,该链接是一个接口,通过该接口,一个视图可以在另一个视图(实现协议)上调用带有参数的函数(视图定义的协议的一部分)。

属性集可以是类的对象,也可以是作为viewA和viewB上的属性共享的对象,例如Array或自定义类的对象,其中viewA和ViewB上的属性可以指向相同的在ViewB消失之后,viewA仍然可以使用数据。这也让你保持viewB持久的状态,比如如果viewB上有游戏,你可以通过你持久保存的数据重建他们在游戏中的位置作为viewA的属性或者可以打开聊天窗口在viewB上他们没有阅读。

具体解决正确性(即加载的单词)这是一种正确的处理方式,但设置属性的一个含义是你必须考虑内存。在ViewB消失后,ViewA中有多个引用并保留引用的对象会占用内存。如果viewA拥有viewB上的所有东西,例如它可以保留viewB等的子视图,则内存开销更高。如果viewA在游戏正在进行时保持游戏数据,因为它们在viewA和viewB之间移动但在游戏结束后不需要它,它应设置为nil以释放内存。