8

Is it possible to serialize a UIView object? If yes how can I do that?

Gilles 'SO- stop being evil'
  • 104,111
  • 38
  • 209
  • 254

1 Answers1

12

UIView implements the NSCoding protocol, so you can use encodeWithCoder: to get a serialized representation, and initWithCoder: to reconstitute a UIView from such a representation. You can find a lot of details in the Serializations Programming Guide for Cocoa.

Here is quick example of how to do it:

- (NSData *)dataForView:(UIView *)view {
  NSMutableData *data = [NSMutableData data];
  NSKeyedArchiver  *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  [archiver encodeObject:view forKey:@"view"];
  [archiver finishEncoding];
  [archiver release];

  return (id)data;
}

- (UIView *)viewForData:(NSData *)data {
  NSKeyedUnarchiver  *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

  UIView *view = [unarchiver decodeObjectForKey:@"view"];
  [unarchiver finishDecoding];
  [unarchiver release];

  return view;
}
Gilles 'SO- stop being evil'
  • 104,111
  • 38
  • 209
  • 254
Louis Gerbarg
  • 43,356
  • 8
  • 80
  • 90
  • 3
    Note that if you are actually using a custom subclass of UIView, you'll need to override encodeWithCoder: and initWithCoder: to add your own properties. – Donovan Voss Jul 24 '09 at 02:45
  • 4
    i think you mean "NSKeyedUnarchiver *unarchiver" and not "NSKeyedArchiver *unarchiver". whilst they are both descended from NSCoding, they aren't the same thing. it still "works" but nanny XCode nags, as she should, in other less trivial instances. – unsynchronized Oct 20 '11 at 05:58
  • UIImageView conforms to NSCoding. I am not sure when the switch happened but my iOS app (iOS 5) has no issue with archiving a UIImageView. Probably iOS 5. – chadbag Oct 10 '12 at 20:13