要創建UIImageView對象的深層副本,需要使用NSKeyedArchiver將其歸檔,然後使用NSKeyedUnarchiver將其解壓縮,但由於UIImage不符合NSCoding協議,因此存在此方法的問題。你首先需要做的是擴展UIImage類來支持NSCoding。
與名NSCoding
上UIImage
添加一個新的類別,並把下面的代碼:
的UIImage + NSCoder.h
#import <UIKit/UIKit.h>
@interface UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;
@end
的UIImage + NSCoder.m
#import "UIImage+NSCoder.h"
@implementation UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder {
NSData *pngData = [decoder decodeObjectForKey:@"PNGRepresentation"];
[self autorelease];
self = [[UIImage alloc] initWithData:pngData];
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:UIImagePNGRepresentation(self) forKey:@"PNGRepresentation"];
}
@end
然後添加一個名稱爲的新類別
的UIImageView + DeepCopy.h
#import <UIKit/UIKit.h>
@interface UIImageView (DeepCopy)
-(UIImageView *)deepCopy;
@end
的UIImageView + DeepCopy.m
#import "UIImageView+DeepCopy.h"
#import "UIImage+NSCoder.h"
@implementation UIImageView (DeepCopy)
-(UIImageView *)deepCopy
{
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:self forKey:@"imageViewDeepCopy"];
[archiver finishEncoding];
[archiver release];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
UIImageView *imgView = [unarchiver decodeObjectForKey:@"imageViewDeepCopy"];
[unarchiver release];
[data release];
return imgView;
}
@end
用法:上的UIImageView和下面的代碼(爲前。) 導入您的UIImageView + DeepCopy.h
UIImageView *imgView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picture.jpg"]];
UIImageView *imageView2 = [imgView1 deepCopy];
在任何體系結構中複製UI組件並不是一個好主意。 – Sulthan 2012-04-17 10:55:10
@Sulthan我明白你的意思。但是,我真的需要UIImageView來保存一些關於模型的數據。當然,它可以存儲CGRect,fileName等。我認爲這比直接使用UIImageView要複雜。感謝您的經驗。我會照顧這個。 – tzzzoz 2012-04-17 11:55:58
你應該能夠從你的模型創建UI,而不是讓你的模型成爲UI的一部分。 – Sulthan 2012-04-17 12:29:23