이 방법으로 간단히 사용 :
UIView* view2 = [view1 copy]; // view1 existed
이로 인해 시뮬레이터가이 앱을 실행할 수 없습니다.
유지를 시도하십시오.
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
에 대한 모든 수정 사항 view2
이에 적용될 것입니다 view1
. 본인 view2
은 view1
.
UIView
복사 할 수없는 이유는 무엇 입니까? 그 이유는 무엇입니까?
답변
앱이 다음과 같이 충돌 할 수 있습니다.
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
그 이유는 UIView는 복사 프로토콜을 구현하지 않기 때문에 copyWithZone
UIView에 선택기 가 없기 때문입니다 .
답변
이것은 당신을 위해 일할 수 있습니다 …보기를 보관하고 바로 보관을 취소하십시오. 이것은 당신에게 뷰의 깊은 사본을 줄 것입니다 :
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
}
}
답변
UIView
NSCoping
프로토콜을 구현하지 않는 경우 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];