ios - 在 View 之间传递数据?

标签 ios objective-c ios7

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

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

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

最佳答案

这可能有帮助:

How to pass prepareForSegue: an object

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

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

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

发生的事情是目标 View Controller 已被实例化。但是您在 pepareForSegue 中获得了第二个 View Controller ,然后它才出现。实际上 viewDidLoad 会在 prepareForSegue 之后被调用。这是一个有趣的链接:viewDidLoad called before prepareForSegue finishes (只是为了避免链接的标题误导,作者调和它没有在 prepareForSegue 之前调用 viewDidLoad)

因为 viewDidLoad 还没有被调用,但是 View 被初始化了,例如程序员可以在第二个 View 上填充作为实例变量的 NSString,并且在它可以使用的第二个 View 的 viewDidLoad 方法中这些字符串来设置它的标签。这是一个很好的引用 Passing Data between View Controllers

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

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

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

关于ios - 在 View 之间传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23409914/

相关文章:

ios - 如何从 NSDictionary 中删除作为 NSDictionary 元素的条目?

ios - UIImagePickerController 不遵守 iPad 上的视频最长持续时间

objective-c - 打开新 View 的按钮

iphone - 如何支持从 iOS 4.3 到 iOS 7 版本的应用程序

ios - 呈现和关闭模态视图 Controller

ios - 适用于所有屏幕尺寸的 Storyboard

iphone - 创建一个较小的 UIPickerView 用于表格

ios - 当您尝试在电子邮件中打开 PDF 时如何列出我的应用程序?

ios - iOS 应用程序中的 Helvetica Neue 字体

objective-c - Sprite Kit 相当于 clipsToBounds :