Tag: nskeyedarchiver

使用NSKeyedArchiver持久化数据(Swift 3)

Apple提供了两种在应用程序启动之间保留数据的方法:Core Data和NSKeyedArchiver。 NSKeyedArchiver编码(保存)和解码(检索)您要持久保存的所有与NSCoding兼容的类。 尽管NSKeyedArchiver不如Core Data健壮(它速度较慢且手动),但它可以完成所需的持久化数据工作,并且不如Core Data复杂。 NSCoding是一种协议,它需要两种方法- 必需的init(编码器解码器:NSCoder)和encode(使用编码器:NSCoder) 。 如果我创建一个符合NSObject和NSCoder的类,则可以将该类序列化(从其当前数据结构转换为可以存储为字节的格式),并反序列化(从字节提取为数据结构)为可以保存到用户磁盘。 为了演示,我将创建一个购物清单应用程序。 步骤1:在情节提要中创建一些UI。 对于此应用程序,我使用了标签栏控制器。 第一个选项卡Add New Item包含一个标签,一个textField和一个按钮。 第二个选项卡Shopping Shopping只是一个tableView,显示了第一个选项卡中我添加的项目。 步骤2:创建我的模型对象和一个单例对象作为我的共享DataStore。 我的对象将是ShoppingItems,现在,每个ShoppingItem都有一个属性:name。 我创建了一个名为ShoppingList的类,并采用了NSObject和NSCoding协议,这将使该类与NSKeyedArchiver兼容。 我创建了1)我的ShoppingList的name属性,2)我的ShoppingList的初始化程序,以及3)创建了一个结构,该结构包含一个静态名称属性来保存我的NSCoding键(为安全起见)。 NSCoder需要两种方法,解码所需的init和编码器进行编码。 encode(使用coder:NSCoder)方法将保存(编码)我创建的Key.name的name属性。 所需的init(coder encoder:NSCoder)方法将检索我保存的名称对象并将其转换为字符串。 我还为我的name属性创建了一个getter / setter,以确保使用加载的newValue更新它。 我还使用单例作为“数据存储”,以便在我的shoppingList数组中拥有一个位置。 步骤3:为我的文本框和按钮创建一个插座和操作。 这些是必需的,以便在单击按钮后我可以在textField中检索输入的文本,并将该文本另存为新的shoppingItem。 第4步:创建一个代表filePath的变量,该变量将指定我们应在何处保存此数据。 在具有textField和按钮的viewController中,创建一个filePath属性。 此filePath属性应创建一个FileManager (如手机上的文件柜文件和文件夹)。 它还应该在我们documentDirectory中 FileManager的url数组中检索一个url。 在这里,我检索了第一个filePath。 filePath属性应该返回该URL,并附加您指定的路径,我使用了“数据”。 var filePath:字符串{ // 1-管理员可让您检查应用程序中文件和文件夹的内容; 创建一个目录到我们要保存的目录 让经理= FileManager.default // 2-这从我们的documentDirectory返回一个url数组,我们采用第一个路径 让url = manager.urls(for:.documentDirectory,in:.userDomainMask).first print(“这是documentDirectory \(url)中的url路径”) // […]

Swift:self.init(coder:aDecoder)正在崩溃与EXC_BAD_ACCESS的应用程序

使用NSCoder和NSKeyArchiver时,错误是崩溃的应用程序。 我在NSCoder上做了一个最近的post,但自那以后,我改变了我的代码,并得到一个新的错误,并决定一个新的职位是最好的。 该应用程序是一个博客阅读器,从使用PHP的MYSQL数据库中读取,以使用JSON在Swift中使用自定义对象填充表视图。 我一直在试图保存mainArray,以便当用户移动单元跨过部分(每个部分都有一个数组)时,它可以保存用户离开它的地方。 Blog.swift:处理博客自定义对象 import UIKit class Blog: NSObject, NSCoding { var blogName: String! var blogStatus1: String! var blogStatus2: String! var blogURL: String! var blogID: String! var blogType: String! var blogDate: String! var blogPop: String! static func createBlog(from jsonObject: AnyObject) -> Blog? { guard let bID: String = jsonObject.object(forKey: "id") as? String, let bName: […]

NSKeyedArchiver和NSKeyedUnarchiver / Swift 3.0

我正在使用NSKeyedArchiver & NSKeyedUnarchiver在Core-Data存储一些复杂的数据,稍后在我的应用程序中检索它。 直到现在,这个工作完美无缺,但在迁移之后, Swift 3.0似乎并不满意我的代码。 我早在我的代码中: var firstArray = [Int](), secondArray = [CGFloat]() ……. // stores some values in firstArray and also in secondArray. ……. 这里是如何存储数据的代码如下所示: let masterArray = [firstArray, secondArray] as [Any] let dataForApp:NSData = NSKeyedArchiver.archivedData(withRootObject: masterArray) as NSData entityFieldsDico = ["dataForAppArray":dataForApp] // Use entityFieldsDico to save dataForApp in Core-Data under the key […]

NSKeyedArchiver为UIView的子视图返回nil

我有一个ViewController,在这里我添加了一个名为DrawingView的自定义UIView。 我想在这个DrawingView中添加dynamic数量的UITextView,所以我将UITextView与类名称分开为CustomTextView。 在ViewController中,我有以下代码将TextView添加到DrawingView。 – (void)viewDidLoad { [super viewDidLoad]; DrawingView * newDrawingView = [[DrawingView alloc]init]; self.drawingView = newDrawingView ; } -(void)setDrawingView:(DrawingView *)_drawingView { if (drawingView != _drawingView) { [drawingView removeFromSuperview]; drawingView = _drawingView; drawingView.customDelegate = self; drawingView.frame = scrollView.bounds; drawingView.layer.cornerRadius = 8; drawingView.backgroundColor = [UIColor whiteColor]; drawingView.clipsToBounds = YES; [self.view addSubview:drawingView]; } } 在button操作上,我在图纸视图中添加了CustomTextView。 currentText = […]

使用NSCoding存档UIImageView

我从来没有使用NSCoding,我很困惑如何实施。 我目前的iPad应用程序有一个UIImageView(称为“背景”),这是我的主视图控制器的属性。 “背景”有一个UIImage“图像”属性(显然)和用户添加的各种子视图。 添加的子视图是我自己的UIImageView的自定义子类。 我需要能够保存“背景”UIImageView的状态,以便可以恢复与存档时相同的图像和所有子视图。 我知道UIImageView符合NSCoding协议,但我不知道在哪里实现encodeWithCoder和initWithCoder。 我从我的主视图控制器调用这些吗? 我是否需要为UIImageView创build一个类别,使我可以重写这些方法? 我是否需要编写代码来存档我的“背景”UIImageView及其子视图的每个属性? 我已经读过其他地方,因为UIImage不符合NSCoding所以需要分类或添加一个类别,以便能够存档UIImageView。 我以为会有一个简单的方法来保存磁盘的一个对象,包括所有的属性,子视图等。似乎有很多事情需要做,以便我保存这个“背景”UIImageView并在以后恢复。 我努力想象我需要做的一切。 任何指针非常感谢!

NSKeyedArchiver / NSKeyedUnarchiver在不同iOS版本上的兼容性

在iOS应用程序中,我们通过NSKeyedArchiver / NSKeyedUnarchiver使用复杂对象的序列化来存储信息和数据。 所以应用程序将在应用程序包中包含这样一个序列化的对象,并且这个文件将在一个特定的iOS版本下创build(比如说iOS 5.0) 由于应用程序将在不同的iOS版本(> 5.0)上运行,甚至在将来的版本中运行,所以我们要确保应用程序包中包含的原始序列化对象在每个其他iOS(6.1,7.0, …) 假设要序列化的复杂对象是由所有这些iOS版本的SDK中包含类的对象组成的(为了简单起见,我们假设将来不会在这些类中发生弃用),我们可以完全确定它会总是与所有的iOS兼容?

Swift:在NSKeyedArchiver错误

Swift 3 iOS 10,尝试在NSKeyedArchiver中保存自定义对象的数组,基本上是在用户使用button切换部分之后保存表视图。 我已经尝试了几个post来解决这个问题,但没有运气,现在我试图自己做NSCoding和NSKeyedArchiver。 错误: 无法将types“[Blog]”的值转换为期望的参数types“NSCoder” 错误代码在Blog.swift中,处理NSCoding和我的博客对象的代码 import UIKit class BlogsCoding: NSObject, NSCoding { var blogList : [Blog] init(blogList : [Blog]) { self.blogList = blogList } convenience required init?(coder aDecoder: NSCoder) { guard let blogList = aDecoder.decodeObject(forKey: "blogs") as? [Blog] else { return nil } self.init (blogList : blogList) } func encode(with aCoder: NSCoder) […]

保存CLLocation错误:发送到不可变对象的变异方法

我已经读了其他相关的问题,但我卡住了。 我正在尝试将最后一个已知位置保存到plist中以备后用。 这是我收到的错误消息: *终止应用程序由于未捕获的exception'NSInternalInconsistencyException',原因:' – [__ NSCFDictionary setObject:forKey:]:mutating方法发送到不可变对象' 这是我的代码: var plist = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Config", ofType: "plist")) var dataToStore = NSKeyedArchiver.archivedDataWithRootObject(lastKnownLocation) plist.setValue(dataToStore, forKey: "location") “lastKnownLocation”var是一个CLLocation。 plist中的“位置”键是“数据”types。 有人可以请帮助,让我知道如何做到这一点(或如果有更好的办法他们如何做)? 谢谢

在两台iOS设备之间通过bonjourstream式传输图像

我的目标是通过bonjour将AVCpatureInput捕获的图像从一台iOS设备stream式传输到另一台iOS设备。 这是我目前的方法: 1)从videoinput捕捉帧 – (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { /*code to convert sampleBuffer into UIImage */ NSData * imageData = UIImageJPEGRepresentation(image,1.0); [connection sendImage:image]; } 2)通过TCP连接发送(来自http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/ ) // Send raw image over network – (void)sendRawImagePacket:(UIImage *)image { // Encode packet NSData * imageData = UIImageJPEGRepresentation(image, 1.0); NSData * rawPacket = [NSKeyedArchiver archivedDataWithRootObject:imageData]; // Write header: […]

使用子视图取消UIImageView的存档

我有点疯狂试图归档和取消存档的UIImageView有一些子视图是从UIImageView派生自定义视图。 以下是我所做的: 向项目添加一个类别,以允许UIImage不符合NSCoding的事实: #import "UIImage-NSCoding.h" #define kEncodingKey @"UIImage" @implementation UIImage(NSCoding) – (id)initWithCoder:(NSCoder *)decoder { if ((self = [super init])) { NSData *data = [decoder decodeObjectForKey:kEncodingKey]; self = [self initWithData:data]; } return self; } – (void)encodeWithCoder:(NSCoder *)encoder { NSData *data = UIImagePNGRepresentation(self); [encoder encodeObject:data forKey:kEncodingKey]; } @end 我正在归档的UIImageView是我的主视图控制器的一个属性,称为“背景”。 我像这样保存它: NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:self.background]; [dataToSave dataWithContentsOfFile:imagePath […]