不使用通知,将数据从一个视图传递到另一个视图以使用属性并将属性分配给目标视图的viewDidLoad
中的某个UI元素的正确方法是吗?
例如,如果我有一个单一视图应用程序,则有一个mainView,它首先出现。我添加了另一个具有标签的ViewController(ViewTwo)。如果mainView尝试在prepareForSegue
中为该标签分配一个字符串,则将失败,因为标签未初始化。首先分配给viewTwo上的属性,然后分配给viewDidLoad
中的UI元素。
另外,如何在不使用通知的情况下将数据从viewTwo返回到mainView?
最佳答案
这可能会有所帮助:
How to pass prepareForSegue: an object
如果将对象传递给第二个视图,则第一个视图还可以保留所有权并读取第二个视图消失后第二个视图写的内容。
为了澄清(此代码来自上面的链接),这个想法是在prepareForSegue
中,您将目标viewcontroller作为要使用的对象。例如:
// Get reference to the destination view controller
YourViewController *vc = [segue destinationViewController];
发生的事情是目标视图控制器已实例化。但是您在pepareForSegue中正在获取第二个视图控制器,然后它才出现。实际上,在prepareForSegue之后将调用viewDidLoad。这是一个有趣的链接: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以释放内存。
关于ios - 在 View 之间传递数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23409914/