这将保存一个数组(我认为).
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:myArray forKey:@"myArray"];
}
Run Code Online (Sandbox Code Playgroud)
我想在保存数组时是否必须直接调用此方法,还是必须执行其他操作?
我需要进行编码和解码类型的财产NSUInteger有NSCoder.
使用方法NSCoder::encodeInteger:forKey:和NSCoder::decodeIntegerForKey:方法是否安全?
我想到的另一种方法是将无符号整数包装到NSNumber第一位.但这意味着更多的代码,我不喜欢它.
我正在尝试将一些自定义类/数据存储到我的iPhone/iPad应用程序中的文件中.
我有一个类RSHighscoreList
@interface RSHighscoreList : NSObject {
NSMutableArray *list;
}
Run Code Online (Sandbox Code Playgroud)
其中包含列表中RSHighscore的对象
@interface RSHighscore : NSObject {
NSString *playerName;
NSInteger points;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将所有文件存储到文件中时
- (void)writeDataStore {
RSDataStore *tmpStore = [[RSDataStore alloc] init];
_tmpStore.highscorelist = self.highscorelist.list;
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:tmpStore forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[archiver release];
[data release];
}
@interface RSDataStore : NSObject <NSCoding, NSCopying> {
NSMutableArray *highscorelist;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:highscorelist forKey:@"Highscorelist"];
}
Run Code Online (Sandbox Code Playgroud)
该应用程序将崩溃并显示错误消息
-[RSHighscore …
出于某种原因,我需要序列化一个包含多个闭包字段的类对象。
像这样:
import Foundation
class Foo: NSObject, NSCoding {
var bar: (() -> Void)
override init() {
bar = {}
}
required init(coder aDecoder: NSCoder) {
bar = aDecoder.decodeObject(forKey: "bar") as! (() -> Void)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(bar, forKey: "bar")
}
}
let foo = Foo()
foo.bar = {
print("Help!")
}
let data = NSKeyedArchiver.archivedData(withRootObject: foo)
let object = NSKeyedUnarchiver.unarchiveObject(with: data) as! Foo
Run Code Online (Sandbox Code Playgroud)
有什么办法可以得到我想要的吗?
之前已经提出过,人们已经就如何做到这一点给出了非常好的指示,例如这里.
但是,如果我只想将一个NSMutableArray(包含另一个NSMutableArray的各种实例)保存到文件中,我想知道我是否真的需要使用NSCoder?我试过这个,但只收到一条错误信息:
-(void)saveLibraryDat {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myLibrary.dat"];
NSError *error;
[myLibrary writeToFile:filePath atomically:YES];
if (error) {
NSLog(@"There was an error saving myLibrary.dat: %@", error);
}
}
Run Code Online (Sandbox Code Playgroud)
我的错误信息:
2011-05-13 22:00:47.840 MoleNotes[15437:207] There was an error saving myLibrary.dat: (
1,
2
)
Run Code Online (Sandbox Code Playgroud)
所以我想我必须和NSCoder合作,对吧?如果是这样,我想知道如何解决这个问题.人们已经解释了如何使用类来完成此操作,但在我的情况下,我有一个NSMutableArray(myLibrary),其中包含类的各种实例.我是否必须在此类和NSMutableArray中实现NSCoder?
我像这样分配我的库:
myLibrary = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)
然后添加一个名为NoteBook.m的类的实例,如下所示:
NoteBook *newNoteBook = [[NoteBook alloc] init];
newNoteBook.titleName = @"Notes"; // etc.
[myLibrary addObject:newNoteBook];
Run Code Online (Sandbox Code Playgroud)
那么我在哪里放置NSCoder命令呢?只进入我的NoteBook.m类?这会自动照顾myLibrary吗? …
我想知道如何NSCoder处理下次解码时由多个对象共享和编码的对象.它会制作对象的两个副本,还是会解码并在解码它的所有其他对象之间共享一个对象?
我提供了一个类似下面这种情况的小例子.
例:
对象A和对象B在步骤6之后是否共享相同的解码对象,或者它们各自都有自己的副本?
当使用NSCoder和NSKeyedArchiver,据我所知,数据存储在二进制格式.因此,什么是最适合存储文件的文件扩展名?许多教程使用.plist,但我相信这应该是文本属性列表〜键/值对.
可能是一个愚蠢的问题 - 怎么encodeWithCoder称呼?我需要用它来保存iphone文件中的对象,我只是不确定它是如何被实际调用的.我必须手动拨打电话吗?如果是这样,我将使用什么作为NScoder参数的输入?
我enum在我的Swift类中声明了一个变量.我需要使用编码和解码它NSCoder.对于我应该使用的这个说法有很多问题rawValue.Enum声明如下:
enum ConnectionType {
case Digital, PWM
}
Run Code Online (Sandbox Code Playgroud)
但是在Swift 1.2中没有这样的初始化器.在Swift 1.2和Xcode 6.3中如何做到这一点?
我CustomTableViewClass在厦门国际银行,将它添加到UITableView喜欢
class RestaurantsTableView: UITableView {
override func awakeFromNib() {
self.register(UINib(nibName: "RestaurantTableViewCell", bundle: nil), forCellReuseIdentifier: "restaurantCell")
}
}
Run Code Online (Sandbox Code Playgroud)
和一切工作正常,现在我想用这个CustomTableViewClass作为UIView在其他一些UIViewController,但我不明白如何正确地重写它的init(coder aCoder: NSCoder)功能,因为我并不需要一个UITableView情况下,当我实现它就像我的其他自定义XIB意见做它崩溃了nil
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let _ = Bundle.main.loadNibNamed("RestaurantTableViewCell", owner: self, options: nil)?[0] as! UIView
}
Run Code Online (Sandbox Code Playgroud) nscoder ×10
objective-c ×7
ios ×3
cocoa-touch ×2
iphone ×2
swift ×2
cocoa ×1
decode ×1
encode ×1
filenames ×1
macos ×1
nscoding ×1
nsinteger ×1
nsuinteger ×1
save ×1
uitableview ×1
uiview ×1
xcode ×1
xib ×1