2011-02-15 4 views
21

인터페이스 작성기를 통해 UIViewController에 연결된 UIView가 있습니다. 두 번 이상 사용할 수 있도록이보기를 복제, 복제 또는 복사 할 수 있습니까?중복, 복제 또는 복사 UIView

+0

[스위프트 대답은] (http://stackoverflow.com/a/37050633/3681880는) – Suragch

답변

1

확실히. 설명서에는 good example of how to achieve that; 그것은 UITableViewCell을위한 것이지만 여기서도 잘 사용하는 방법입니다.

보기의 복잡도에 따라 사용자 정의보기 클래스로 만들고 하위 뷰가있는 모든 속성에 대해 IBOutlet 속성을 부여 할 수 있습니다. 이 경우 인터페이스 작성기에서 해당 클래스의보기에 대한 "클래스 ID"를 설정합니다. 그런 다음 위의 문서에서 제안한대로 예를 들어 [myLoadedView viewWithTag:3]을 사용하지 않고보기 컨트롤러가 예를 들어 myLoadedView.someLabel을 통해 주어진 XIB로로드 된보기의보기에 액세스 할 수 있습니다.

+2

있는 UITableViewCell은로드입니다 여러 번, 결코 복제되지 않았습니다. – geon

+1

차이점은 무엇입니까? –

+8

제 생각에 @geon은 펜촉을 여러 번 열어서 새 개체를 만드는 동안 OP의 요구 사항을 해결하는 것처럼 보이지만 질문 제목에 암시 된대로 문제에 대한 일반적인 해결책으로 사용되지는 않습니다. 이것은 코드에서 생성 된 UIView의 일반적인 경우에는 작동하지 않습니다 (예 :'[UIView alloc] initWithFrame : aFrame];). 대답은 맞지만 질문 제목은 오해의 소지가 있습니다. – clozach

30

다음 카테고리는 특히 효율적일 수 있지만, 하나 개의 프로젝트에 나를 위해 일한되지 않을 수 있습니다

@implementation UIView (OPCloning) 

- (id) clone { 
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self]; 
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData]; 
    return clone; 
} 

@end 

내가 -copy 또는 -copyWithZone 구현하지 것 : 애플이 미래에 그렇게 할 수있다. 모든보기가 동일한 범위로 아카이브를 구현하는 것은 아닙니다. 복제 할 NSView 서브 클래스의 사용자 정의 속성에 대한 NSCoding 메소드를 구현해야합니다 (그렇지 않으면 복제 된 뷰에서는 nil이됩니다). 사용자 정의 복제 코드를 작성하는 것보다 쉽습니다.

+1

외부 저장 장치에 액세스하지 않아도 펜촉을 반복적으로로드하는 것보다 훨씬 효율적입니다. – osxdirk

+0

필자의 경우 보관 및 보관 해제는 번들 (외부 저장소)에서 펜촉을로드하는 것보다 약 20-25 % 더 많은 시간이 걸렸습니다. 어쨌든 나는 여전히 loadNibNamed 성능을 향상시킬 방법을 찾고있다. –

+0

복제 된보기의 이미지가 iOS 9에서 너무 느리게로드됩니다. – Suresh

13

다음은 사용할 수있는 새로운 방법 : 사용하여 UIView의 방법

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

이보기를 그릴 수있는 가장 빠른 방법입니다. 아이폰 OS에서 사용 가능 7.

+1

참고 :이 방법은 매우 구체적인 사용 사례에 대한 좋은 해결책이지만 실제로이 방법은 원본과 동일한 유형의 새로운보기를 만들지 않습니다. 보기와 같이 보이는 순간 (예 :보기의 '스크린 샷 찍기')과 같이 보이는보기를 만듭니다.이보기는 대기 상태로 사용할 수 있습니다. 전환 효과 또는보기를 다시로드/다시 만들 때 – uliwitness

2
당신은 아래 스위프트 3.0.1 시도 할 수 있습니다

:

extension UIView{ 
func copyView() -> AnyObject{ 
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject 
} 
} 
관련 문제