Create a copy of a UIView in Swift

后端 未结 7 1867
长发绾君心
长发绾君心 2020-11-29 05:01

Because objects are reference types, not value types, if you set a UIView equal to another UIView, the views are the same object. If you modify one

7条回答
  •  心在旅途
    2020-11-29 05:25

    This answer shows how to do what @uliwitness suggested. That is, get an identical object by archiving it and then unarchiving it. (It is also basically what Ivan Porkolab did in his answer, but in a more readable format, I think.)

    let myView = UIView()
    
    // create an NSData object from myView
    let archive = NSKeyedArchiver.archivedData(withRootObject: myView)
    
    // create a clone by unarchiving the NSData
    let myViewCopy = NSKeyedUnarchiver.unarchiveObject(with: archive) as! UIView
    

    Notes

    • Unarchiving the data creates an object of type AnyObject. We used as! UIView to type cast it back to a UIView since we know that's what it is. If our view were a UITextView then we could type cast it as! UITextView.
    • The myViewCopy no longer has a parent view.
    • Some people mention some problems when working with UIImage. However, see this and this answer.

    Updated to Swift 3.0

提交回复
热议问题