【问题标题】:Pass value using NSCoding Protocol使用 NSCoding 协议传递值
【发布时间】: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 协议确认

【问题讨论】:

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

标签: objective-c xcode nscoding


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2011-01-09
      相关资源
      最近更新 更多