1

创建一个精确的对象副本是可能的UINavigationController?我已经看到使用 复制对象的示例copyWithZone:,但是对于如何使用它来复制我的UINavigationController.

有什么帮助吗?

4

2 回答 2

1

UINavigationController不符合NSCopying协议,所以不能使用copyWithZone:or copy

如果您希望有一个UINavigationController可以在整个应用程序中使用的自定义,那么您应该将其子类化,然后在每次需要新子类时创建该子类的新实例,例如当您创建新的模态视图控制器时。

编辑:如果您想保留以前导航控制器的视图控制器,那么您可以执行以下操作(如果需要,使用子类导航控制器):

UINavigationController *newNavigationController = [[UINavigationController alloc] init];
[newNavigationController setViewControllers:oldNavigationController.viewControllers animated:NO];

这将对视图控制器进行浅拷贝,即您将引用原始导航控制器的视图控制器,而不是副本。如果您想在视图控制器上进行深度复制,那么这将更加复杂,并且需要为每个视图控制器提供特定的复制代码。(有关更多信息,请参见此处)。

于 2012-08-30T06:38:20.587 回答
0

您可以通过创建类别(或子类)、使类别符合 NSCoding 并添加必要的编码和解码功能来做到这一点。然后,您需要确定要编码的属性 - 它当前在其数组中具有的视图控制器的类型,也许您需要使这些对象符合 NSCoding 标准。你可以看到,这不是一件小事,但也不是不可能的。您可能会发现最好使用其他一些技术来解决您的问题。

编辑:如果你想“复制”它,你真正需要知道的是数组中的 viewControllers 是什么。因此,假设您要复制“状态”,这在某种意义上与原始答案相同,但不那么严格。为每个对象添加一个类别或方法,并要求将当前状态作为字典提供给您。对于 navigationController,这可能只是当前堆栈上的对象的类。

对于堆栈中的每个对象,您可以让它们为您提供有关其状态的字典。通过状态,它意味着 UITextFields、视图等中的文本是什么,该对象需要从启动条件返回到现在的位置。

您将这一切打包 - 导航字典和状态数组。您可以将其保存为 plist。当你想构建你以后的位置时,导航控制器可以通过知道它们的类来告诉要创建哪些对象,然后在创建每个对象时,它可以发送它的字典并告诉“回到你所在的位置”。完成后,将另一个控制器推入堆栈。

于 2012-08-30T13:03:14.237 回答