[ios] UIView를 복사 할 수 있습니까?

이 방법으로 간단히 사용 :

UIView* view2 = [view1 copy]; // view1 existed

이로 인해 시뮬레이터가이 앱을 실행할 수 없습니다.

유지를 시도하십시오.

UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc

에 대한 모든 수정 사항 view2이에 적용될 것입니다 view1. 본인 view2view1.

UIView복사 할 수없는 이유는 무엇 입니까? 그 이유는 무엇입니까?



답변

앱이 다음과 같이 충돌 할 수 있습니다.

 [UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280

그 이유는 UIView는 복사 프로토콜을 구현하지 않기 때문에 copyWithZoneUIView에 선택기 가 없기 때문입니다 .


답변

이것은 당신을 위해 일할 수 있습니다 …보기를 보관하고 바로 보관을 취소하십시오. 이것은 당신에게 뷰의 깊은 사본을 줄 것입니다 :

id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];


답변

UIView 확장을 만들 수 있습니다. 아래의 빠른 스 니펫 예제에서 copyView 함수는 AnyObject를 반환하므로 UIView의 모든 하위 클래스, UIImageView를 복사 할 수 있습니다. UIView 복사 하려면 반환 유형을 UIView로 변경할 수 있습니다.

//MARK: - UIView Extensions

    extension UIView
    {
       func copyView<T: UIView>() -> T {
            return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
       }
    }

사용 예 :

let sourceView = UIView()
let copiedView = sourceView.copyView()


답변

swift3.0.1의 경우 :

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


답변

UIViewNSCoping프로토콜을 구현하지 않는 경우 UIView.h 의 선언을 참조하십시오 .

@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>

그래서 copy우리가 비슷한 방법 을 갖고 싶다면 , 우리 NSCoping는 범주 에서 프로토콜 을 구현해야합니다 .


답변

다음과 같이 메소드를 만들 수 있습니다.

-(UILabel*)copyLabelFrom:(UILabel*)label{
//add whatever needs to be copied
UILabel *newLabel = [[UILabel alloc]initWithFrame:label.frame];
newLabel.backgroundColor = label.backgroundColor;
newLabel.textColor = label.textColor;
newLabel.textAlignment = label.textAlignment;
newLabel.text = label.text;
newLabel.font = label.font;

return [newLabel autorelease];

}

그런 다음 ivar를 반환 값으로 설정하고 다음과 같이 유지할 수 있습니다.

myLabel = [[self copyLabelFrom:myOtherLabel] retain];


답변