克隆或复制UIViewController或UIView

15

我需要复制UI,使用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没有可变副本。 - Raptor
3个回答

31

使用 -

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

同样的 -

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

2
不能获取所有内容,如自定义手势等。 - jjxtra
哦,我没有获取到我作为视图子视图的UIImageView,这个视图是我正在克隆的。 - Carl Hine

5
很抱歉,我目前还不允许评论,但是rishi的解决方案有一个问题:它不能复制NSLayoutConstraint。因此,如果你的任何视图正在使用autolayout,那么这些autolayout将不能被复制。我正在编写一个迷你库来解决这个问题,完成后将发布到github。不幸的是,我还没有在任何地方找到现成的解决方案。
//编辑
很抱歉,我之前写的不完全正确。我做了更多的研究,发现默认情况下,存档视图中的NSLayoutConstraint是不会被保存的。但是,你实际上可以通过将其“shouldBeArchived”属性设置为“YES”来指定是否要归档约束。然后,在进行这个假的复制之后,你仍然保留了正确的约束在复制的视图中。

5

要使一个对象可复制,它必须实现NSCopying协议,但UIView类和UIViewController类都没有实现该协议。

如果您想复制视图,那么我非常确定您正在做错事情。应该使用可重用的UIView来代替复制,就像在UITableView中使用dequeueReusableCellWithIdentifier:方法一样。

复制视图控制器绝对是一种反模式。如果您想要与已有的视图控制器完全相同的副本-请创建具有相同参数的新实例。


1
尽管Rishi的答案对我也起作用了,但创建新实例证明是我的问题更可靠的解决方案。谢谢! - Myxtic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接