2012-05-16 3 views
12

UII 복사, 자체 컨트롤러 또는 self.view 필요가, 내가 시도는 :복제 또는 복사의 UIViewController 또는 UIView의

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 
+0

'self '의 클래스는 무엇입니까? 'MyViewController'? 나는 UIView와 UIViewController의 복사본이 없다고 생각한다. – Raptor

답변

30

사용 - 유사

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

-

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

사용자 지정 제스처 등의 모든 것을 얻지 못합니다. – jjxtra

+0

흠, 내가 복제 한 뷰의 하위 뷰로 UIImageView를 가져 오지 않았습니다. –

5

그것을해야 복사 가능한 것으로 UIView 클래스 또는 UIViewController 클래스는 구현하지 않는 NSCopying 프로토콜을 구현하십시오.

보기를 복사하려면 잘못된 것을하고있는 것이 틀림 없습니다. 복사는 dequeueReusableCellWithIdentifier: 방법을 사용하여 UITableView처럼 다시 사용할 수있는 UIView으로 바꿔야합니다.

보기 컨트롤러를 복사하는 것은 분명히 반 패턴입니다. 이미 가지고있는 뷰 컨트롤러의 정확한 복사본을 원한다면, 현재의 뷰 컨트롤러와 동일한 매개 변수로 새로운 뷰 컨트롤러를 생성하십시오.

+1

리시의 대답은 나에게도 도움이되었지만, 새로운 인스턴스를 만드는 것이 내 문제에 대한보다 신뢰할만한 해결책으로 판명되었다. 감사! – Myxtic

4

불행하게도 난 아직 언급 할 수 없습니다,하지만 리시의 솔루션은 하나의 문제가있다 : 그것은 NSLayoutConstraint의 복사하지 않습니다. 그래서 여러분의 견해 중 어떤 것이 자동 레이아웃을 사용하고 있다면, 그것들은 복사되지 않을 것입니다. 나는 그것을 해결하기 위해 미니 라이브러리를 작성 중이며 완료되면 github에 게시 할 것입니다. 불행히도 어디에서나 즉시 사용할 수있는 솔루션을 찾지 못했습니다.

// 편집

죄송합니다. 이전에 작성한 내용이 완전히 잘못되었습니다. 좀 더 연구를했는데 기본적으로 보관 된보기의 NSLayoutConstraint이 저장되지 않습니다. 그러나 shouldBeArchived 속성을 YES으로 설정하여 제약 조건을 보관할지 여부를 실제로 지정할 수 있습니다. 그런 다음 위조 된 후에도 copy, 복사 된보기에서 오른쪽 제약 조건을 유지합니다.

관련 문제