我正在尝试使用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协议
答案 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
。