【问题标题】:Clone or Copy UIViewController or UIView克隆或复制 UIViewController 或 UIView
【发布时间】:2012-05-23 18:20:15
【问题描述】:

UII需要copy,self controller或者self.view,我试过了:

UIView* viewOfSelf =[self.view copy];
UIViewController* controller = [self copy];

UIView* viewOfSelf =[self.view mutableCopy];
UIViewController* controller = [self mutableCopy];

错误是:

    -[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0

【问题讨论】:

  • self 的类是什么? MyViewController ?我认为UIViewUIViewController 没有可变副本

标签: objective-c uiview uiviewcontroller copy clone


【解决方案1】:

对于一个可复制的对象,它必须实现NSCopying 协议,而UIView 类和UIViewController 类都没有。

如果你想复制一个视图,我很确定你做错了什么。复制应替换为可重复使用的UIView,就像在UITableView 中使用dequeueReusableCellWithIdentifier: 方法一样。

复制视图控制器绝对是一种反模式。如果您想要您已经拥有的视图控制器的精确副本 - 使用与当前参数相同的参数创建它的新实例。

【讨论】:

  • 尽管 Rishi 的回答也对我有用,但事实证明,创建新实例是解决我的问题的更可靠的解决方案。谢谢!
【解决方案2】:

使用 -

NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view];
UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView];

同样——

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];

【讨论】:

  • 没有得到自定义手势等所有内容。
  • 嗯,没有得到我的 UIImageView 作为我正在克隆的视图的子视图。
【解决方案3】:

不幸的是,我还不能发表评论,但 rishi 的解决方案有一个问题:它不会复制 NSLayoutConstraints。因此,如果您的任何视图使用自动布局,则不会被复制。我正在编写一个 mini-lib 来解决这个问题,并在完成后将其发布到 github。不幸的是,我在任何地方都没有找到现成的解决方案。

//编辑

对不起,我之前写的不完全正确。我做了更多研究,结果发现默认情况下,存档视图中的NSLayoutConstraints 没有保存。但是,您实际上可以通过将其shouldBeArchived 属性设置为YES 来指定是否要归档约束。然后,即使在这个伪造的copy 之后,您仍会在复制的视图中保留正确的约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多