[英]Restore UIView from NSData
我想在NSData中存儲UIView,然后從存儲的NSData中恢復UIView。 據我所知,在調試器中,它可以工作,但在恢復后我看不到UIView。 這是我的代碼:
- (IBAction)selStore:(id)sender {
dImageView = [NSKeyedArchiver archivedDataWithRootObject:ivDemo];
}
- (IBAction)selDelete:(id)sender {
NSArray *viewsToRemove = [ivDemo subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
}
- (IBAction)selRestore:(id)sender {
ivDemo = [NSKeyedUnarchiver unarchiveObjectWithData:dImageView];
[ivDemo setNeedsDisplay];
}
這里是在NSData dImageView中存儲UIView后調試器的結果
在_subviewCache中是我添加到UIView的兩個UIImageView。
這里是在刪除UIView中的子視圖后調試器的結果:
沒有_subviewCache
最后,我從NSData恢復UIView
_subviewCache顯示了兩個UIImageViews
但是,UIView在iPad屏幕上沒有刷新。 知道我錯過了什么嗎?
我真的很好奇,看看這是否可能(雖然我不能想到我使用它的原因)。
我在Swift中對此進行了探討,但在這種情況下,Objective-C和Swift之間應該沒有區別。
我發現我可以將單個視圖歸檔/取消歸檔,但是一旦我嘗試使用子視圖歸檔視圖,它就會意外地進行操作。
我能做的最好的事情是歸檔一組視圖,但同樣它們只能是兄弟姐妹而不是嵌套的視圖層次結構。
您可能更幸運的是創建一些代表您的視圖的數據模型,歸檔模型,然后使用您的模型重新創建視圖。
import UIKit
class ViewController: UIViewController {
var archiver:NSData?
@IBOutlet weak var containerView: UIView!
@IBAction func toggle(sender: UIButton) {
if let data = self.archiver {
if let views = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [UIView] {
for view in views {
self.containerView.addSubview(view)
}
self.archiver = nil
}
}
else {
let views = self.containerView.subviews
for view in views {
view.removeFromSuperview()
}
self.archiver = NSKeyedArchiver.archivedDataWithRootObject(views)
}
}
}
您可以使用encodeWithCoder:獲取序列化對象,並使用initWithCoder:重建imageview或任何視圖以進行恢復。 請仔細閱讀以下文檔: Cocoa序列化編程指南 。
例如:
- (void)encodeWithCoder:(NSCoder *)coder {
if ([coder isKindOfClass:[NSKeyedArchiver class]]) {
[coder encodeObject:self.user.firstName forKey:kFirstName];
[coder encodeObject:self.user.dateOfBirth forKey:kDateOfBirth];
[coder encodeFloat:self.user.imageView forKey:kUserImageView];
}
else {
[NSException raise:NSInvalidArchiveOperationException format:@"Only supports NSKeyedArchiver coders"];
}
}
- (void)decodeWithCoder:(NSDecoder *)decoder {
if ([decoder isKindOfClass:[NSKeyedUnarchiver class]]) {
NSString *userName = [decoder decodeObjectForKey:kFirstName];
NSDate *dateOfBirth = [decoder decodeObjectForKey:kDateOfBirth];
UIImageView *userImageView = [decoder decodeObjectForKey:kUserImageView];
}
else {
[NSException raise:NSInvalidArchiveOperationException format:@"Only supports NSKeyedUnarchiver decoders"];
}
}
- (NSData *)dataForObject:(User *)userProfile {
NSMutableData *archivingData = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archivingData];
[archiver encodeObject:userProfile forKey:@"userProfile"];
[archiver finishEncoding];
archiver = nil;
return (id)data;
}
- (User *)userProfileForData:(NSData *)data {
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
User *userProfile = [unarchiver decodeObjectForKey:@"userProfile"];
[unarchiver finishDecoding];
unarchiver = nil;
return view;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.