web-dev-qa-db-ja.com

UIViewをコピーできますか?

この方法を使用するだけです:

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

これにより、シミュレータがこのアプリを起動できなくなります。

保持してみて、

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

view2への変更はview1に適用され、view2view1と同じメモリを共有することを理解しています。

UIViewをコピーできないのはなぜですか?理由は何ですか?

81
Forrest

あなたのアプリはおそらく次のようなものでクラッシュします:

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

その理由は、UIViewはコピープロトコルを実装していないため、UIViewにはcopyWithZoneセレクターがないためです。

33
Engin Kurutepe

これはあなたのために働くかもしれません...ビューをアーカイブし、その後すぐにそれをアーカイブ解除します。これにより、ビューの詳細コピーが得られます。

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

UIView拡張機能を作成できます。以下の例では、Swiftスニペット)、関数copyViewはAnyObjectを返すので、UIViewのサブクラスをコピーできますieUIImageView 。onlyUIViewをコピーする場合、戻り値の型を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()
24
Ivan Porkolab

swift3.0.1の場合:

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

UIViewNSCopingプロトコルを実装しません。IView.hの宣言を参照してください。

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

そのため、copyのようなメソッドが必要な場合は、NSCopingプロトコルをカテゴリなどに実装する必要があります。

1
HongchaoZhang