15

UII 需要副本、自我控制器或 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
4

3 回答 3

31

采用 -

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

相似地 -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
于 2012-05-16T08:13:01.287 回答
5

对于可复制的对象,它必须实现类或类不实现的NSCopying协议。UIViewUIViewController

如果你想复制一个视图,我很确定你做错了什么。复制应该UIViewUITableViewusingdequeueReusableCellWithIdentifier:方法一样替换为可重用。

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

于 2012-05-16T08:04:07.230 回答
5

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

//编辑

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

于 2013-09-01T10:05:23.440 回答