【问题标题】:Objective-C Copying a viewObjective-C 复制视图
【发布时间】:2011-09-23 15:17:30
【问题描述】:

所以我在这里有一个简单的问题......

我有一个视图控制器对象的实例,我们称它为viewCon1,它上面放置了几个具有独特属性的子视图。让我们称他们为sub1sub2sub3。现在,我以编程方式添加这些子视图中的每一个:

//create the subviews
TaskUIButton *sub1 = [[TaskUIButton alloc] init];
TaskUIButton *sub2 = [[TaskUIButton alloc] init];
TaskUIButton *sub3 = [[TaskUIButton alloc] init];

//add them to viewCon1
[viewCon1.view addSubView:sub1];
[viewCon1.view addSubView:sub2];
[viewCon1.view addSubView:sub3];

现在我不知道该怎么做。我需要创建另一个名为viewCon2 的视图控制器对象,并使其与viewCon1 完全相同,并附加相同的(虽然是单独的)子视图。因此,例如,假设viewCon1sub1 的标题为"foo",我需要viewCon2 也有一个标题为"foo" 的相同子视图,等等。

有什么简单的方法可以解决这个问题吗?

如果有任何见解,我将不胜感激,谢谢!

【问题讨论】:

  • 创建一个UIViewController 子类并在其中添加按钮。它将自动在该子类的所有实例中可用。
  • 您说您已经在使用视图控制器对象的实例 - 所以您肯定可以创建同一类的另一个实例来解决您的问题吗?
  • 好吧,按钮子视图的数量在编译时是未知的。按钮子视图由用户添加,并根据用户请求创建另一个视图控制器 (viewCon2)。创建我的视图控制器对象的实例只会给我一个没有按钮子视图的空白。
  • 这里的问题是视图具有两个位置所需的属性(您不能同时在两个位置拥有视图)。您可以将所需的属性从视图中分离出来,让它们在其他地方共享这些属性,或者执行类似“复制”的方法,您只需将所需的所有属性从一个复制到另一个,然后为每个视图调用它。跨度>

标签: objective-c view copy subview


【解决方案1】:

UIViewController 和 UIView 都没有实现 NSCopying 协议,因此复制此类对象不仅仅是一个步骤。总体思路是创建相关类的新实例并复制原始对象的配置。

由于您已经有了为视图控制器配置视图的代码,最简单的方法是再次调用该方法来创建视图控制器的第二个实例。我意识到您的代码现在可能无法设置为执行此操作,因此您可能需要重构以使其成为可能。

根据上面的 cmets,听起来您可能会在视图中存储一些状态,而不是让视图反映存储在应用程序中的数据。它可能有助于确定哪些信息决定了视图的布局,并确保数据在应用程序的数据模型中正确表示。如果你能做到这一点,你应该能够简单地基于相同的数据创建一个新的视图控制器并获得相同的布局。

【讨论】:

  • 很遗憾没有实现 NSCopying 协议。我认为使用当前数据模型复制视图的最简单方法是执行 vakio 建议的操作并创建一个复制方法,该方法仅复制每个按钮子视图的每个属性。有点乏味,但它会工作。
  • 您可能会明白为什么没有实现 NSCopying —— 单个视图可能包含许多其他视图,其中一些可能无法复制。但是,由于您知道要从每个视图中复制什么,因此您可以为每个采用 NSCopying 的视图类添加一个类别。这将是一种干净、一致的方式来实现您的复制方法。
  • 太棒了,我会看看我能做什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多