Clone or Copy UIViewController or UIView

前端 未结 3 1069
野的像风
野的像风 2020-12-17 14:43

UII need copy, self controller or self.view, i have tried:

UIView* viewOfSelf =[self.view copy];
UIViewController* controller = [self copy];

UIView* viewOfS         


        
相关标签:
3条回答
  • 2020-12-17 15:19

    Unfortunately I am not yet allowed to comment, but rishi's solution has one problem: it does not copy NSLayoutConstraints. So if any of your views are using autolayout, those are not going to get copied. I am writing a mini-lib to solve that and will post it to github when done. Unfortunately, I haven't found a ready-to-use solution anywhere.

    //Edit

    Sorry, what I wrote previously was not completely correct. I did some more research and it turns out that on default, the NSLayoutConstraints in the archived view are NOT saved. But, you can actually specify if you want to archive a constraint by setting its shouldBeArchived property to YES. Then, even after this fake copy, you retain the right constraints in the copied view.

    0 讨论(0)
  • 2020-12-17 15:23

    For an object to be copyable it must implement NSCopying protocol which UIView class nor UIViewController class do not.

    If you want to copy a view, I'm pretty sure you're doing something wrong. The copying should be replaced by reusable UIView just like in UITableView using dequeueReusableCellWithIdentifier: method.

    Copying view controller is definitely an anti-pattern. If you want exact copy of the view controller that you already have - create a new instance of it with same parameters that current one is.

    0 讨论(0)
  • 2020-12-17 15:26

    Use -

    NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view];
    UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView];
    

    Similarly -

    NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
    UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
    
    0 讨论(0)
提交回复
热议问题