克隆或复制UIViewController或UIView

时间:2012-05-16 07:58:48

标签: objective-c uiview uiviewcontroller copy clone

UII需要复制,自我控制或自我查看,我尝试过:

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

3 个答案:

答案 0 :(得分:30)

使用 -

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

同样 -

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

答案 1 :(得分:5)

对于可复制的对象,它必须实现NSCopying类和UIView类不具有的UIViewController协议。

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

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

答案 2 :(得分:4)

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

//修改

抱歉,我之前写的内容并不完全正确。我做了一些更多的研究,结果证明,默认情况下,存档视图中的NSLayoutConstraint不会被保存。但是,您可以通过将其shouldBeArchived属性设置为YES来实际指定是否要存档约束。然后,即使在这个假copy之后,您在复制的视图中保留了正确的约束。