可以复制UIView吗?

For*_*est 81 copy objective-c uiview ios

只需使用这种方式:

UIView* view2 = [view1 copy]; // view1 existed
Run Code Online (Sandbox Code Playgroud)

这将导致模拟器无法启动此应用程序.

试试保留,

UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
Run Code Online (Sandbox Code Playgroud)

任何修改view2都适用于view1,我明白view2共享相同的内存view1.

为什么不能UIView复制?是什么原因?

j2e*_*nue 160

这可能适合你...存档视图,然后立即取消存档.这应该为您提供视图的深层副本:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
Run Code Online (Sandbox Code Playgroud)

  • 它有效,但要注意!它没有设置@IBOutlets的值,所有这些都是"复制"后的nil (6认同)

Eng*_*epe 33

您的应用可能会崩溃,例如:

 [UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
Run Code Online (Sandbox Code Playgroud)

原因是UIView没有实现复制协议,因此copyWithZoneUIView中没有选择器.

  • 我该怎么做才能实现UIView的副本? (10认同)

Iva*_*lab 25

你可以制作一个UIView扩展.在下面的示例swift片段中,函数copyView返回AnyObject,因此您可以复制UIView的任何子类, UIImageView.如果你想复制 UIViews你可以改变返回类型的UIView.

//MARK: - UIView Extensions

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

用法示例:

let sourceView = UIView()
let copiedView = sourceView.copyView()
Run Code Online (Sandbox Code Playgroud)


Sou*_*ean 6

对于swift3.0.1:

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