【问题标题】:Passing data between views?在视图之间传递数据?
【发布时间】:2014-06-18 01:29:29
【问题描述】:

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

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

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

【问题讨论】:

  • 更新了答案,我认为在重新阅读问题后有必要提供更多信息。

标签: ios objective-c ios7


【解决方案1】:

这可能会有所帮助:

How to pass prepareForSegue: an object

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

为了澄清(这段代码来自上面的链接),这个想法是在prepareForSegue 你得到目标视图控制器作为一个对象来使用。例如:

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

发生了什么是目标视图控制器已被实例化。但是您在 pepareForSegue 中获得了第二个视图控制器,然后才出现。事实上 viewDidLoad 会在 prepareForSegue 之后被调用。这是一个有趣的链接:viewDidLoad called before prepareForSegue finishes(只是为了不误导链接的标题,作者同意它在prepareForSegue之前没有调用viewDidLoad

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

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

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

专门解决正确性(即加载的单词)这是一种正确的做事方式,但设置属性的一个含义是您必须考虑内存。一个对象有多个引用,并且在 ViewB 消失后还保留在 ViewA 中的引用,会占用内存。例如,如果 viewA 拥有 viewB 上的所有内容,则可以保留 viewB 的子视图等,则内存开销会更高。如果在游戏进行时 viewA 在 vi​​ewA 和 viewB 之间移动时保留了游戏数据,但在游戏结束后不需要它,则应将其设置为 nil 以释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多