使用NSCoding协议传递值

时间:2017-07-31 12:17:21

标签: objective-c xcode nscoding

我正在尝试使用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];

但它崩溃的是msg

  

由于未捕获的异常而终止应用   '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协议

2 个答案:

答案 0 :(得分:1)

据我所知,从故事板加载ViewController时会调用- (id) initWithCoder:(NSCoder *) aDecoder。如果要使用代码推送到故事板中的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中可以被触发。你可以在里面做一些初步的工作。

答案 1 :(得分:0)

使用字典传递一堆对象。

但是如果你想使用档案,请阅读NSCoder的文档,它说:

  

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

     

...

     

Foundation为此目的提供的具体子类是NSArchiver,NSUnarchiver,NSKeyedArchiver,NSKeyedUnarchiver和NSPortCoder。

使用NSKeyedArchiver