使用 NSCoding 协议传递值

Posted

技术标签:

【中文标题】使用 NSCoding 协议传递值【英文标题】:Pass value using NSCoding Protocol 【发布时间】:2017-07-31 12:17:21 【问题描述】:

我正在尝试在使用 NSCoding 协议单击 UITabelViewCell 内的单元格时将数据传递到详细信息页面

NSCoder *coder =[[NSCoder alloc] init];

[coder encodeObject:@"value" forKey:@"title"];

[coder encodeObject:cell.remainderContentLabel.text forKey:@"content"];

[coder encodeObject:cell.remainderDateTimeLabel.text forKey:@"datetime"];

[coder encodeObject:cell.remainterImageView.image forKey:@"image"];

RemainderDetailViewController *detailVC = [[RemainderDetailViewController alloc] initWithCoder:coder];

[self.navigationController pushViewController:detailVC animated:YES];

但它是崩溃的味精是

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'*** -encodeObject:forKey: 无法发送到 NSCoder 类的抽象对象:创建一个 具体实例!'

详细页面解码由

完成
- (id) initWithCoder:(NSCoder *) aDecoder 

    if(self = [super initWithCoder:aDecoder]) 

      _remainderTitle.text =  [aDecoder decodeObjectForKey:@"title"];

      _remainderDetails.text =  [aDecoder decodeObjectForKey:@"content"];

      _dateAndTime.text =   [aDecoder decodeObjectForKey:@"datetime"];

      _remainderImage.image =  [aDecoder decodeObjectForKey:@"image"];

    

    return self;

如何使用

- (void)encodeWithCoder:(NSCoder *)encoder

我做错了什么?类被 NSCopying 协议确认

【问题讨论】:

***.com/questions/22168753/… ?但是要在 UITableViewCell 中传递数据,我不明白为什么要使用 NSCoding。 何时调用此 encodeWithCoder?我怎样才能推动 VC 详情页需要在很多地方重复使用。所以我可以简单地从任何地方编写 initWithCoder 我更仔细地阅读了您的代码,RemainderDetailViewController 代码并没有真正的意义。 RemainderDetailViewController 有 xib 吗?故事板? 这是故事板@Larme 【参考方案1】:

据我所知,- (id) initWithCoder:(NSCoder *) aDecoder 在您从情节提要加载 ViewController 时被调用。如果您想使用代码推送到情节提要中的 ViewController。你可以

RemainderDetailViewController *detailVC = [[UIStoryboard storyboardWithName:@"XXX" bundle:nil] instantiateViewControllerWithIdentifier:@"yourControllerIdentifier"];
detailVC.paramDic = @...;
[self.navigationController pushViewController:detailVC animated:YES];

“yourControllerIdentifier”是在storyboard中定义的,不能直接使用该方法初始化一个ViewController。并且可以在目标 ViewController - (id) initWithCoder:(NSCoder *) aDecoder 中触发。你可以在里面做一些初步的工作。

【讨论】:

【参考方案2】:

使用字典传递一堆对象。

但如果你想使用存档,请阅读NSCoder 的文档,上面写着:

NSCoder 抽象类声明了具体子类用来在内存和其他格式之间传输对象和其他值的接口。

Foundation 为这些目的提供的具体子类是 NSArchiver、NSUNarchiver、NSKeyedArchiver、NSKeyedUnarchiver 和 NSPortCoder。

使用NSKeyedArchiver

【讨论】:

以上是关于使用 NSCoding 协议传递值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 和 NSCoding:对符合类协议的对象数组进行编码

NSCopying和NSCoding对象序列化反序列化基础详解

将 Codable 保存到 UserDefaults 并匹配 NSCoding 的外观

无法通过 NSCoding 保存表数据

iOS-NSCoder 和 NSCoding

NSCoding序列化