- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在通过在线类(class)学习 iOS 开发,每次我制作自定义 View (自定义表格 View 单元格、 Collection View 单元格等)时,讲师总是实现此初始化程序:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
为什么我总是必须调用它?它有什么作用?我可以将属性放入 init 中吗?
最佳答案
我将从相反的方向开始这个回答:如果您想将 View 状态保存到磁盘怎么办?这称为序列化。反过来是反序列化 - 从磁盘恢复对象的状态。
NSCoding
协议(protocol)定义了两种序列化和反序列化对象的方法:
encodeWithCoder(_ aCoder: NSCoder) {
// Serialize your object here
}
init(coder aDecoder: NSCoder) {
// Deserialize your object here
}
那么为什么在您的自定义类中需要它呢?答案是界面生成器。当您将一个对象拖到 Storyboard上并对其进行配置时,Interface Builder 将该对象的状态序列化到磁盘上,然后在 Storyboard出现在屏幕上时将其反序列化。您需要告诉 Interface Builder 如何执行这些操作。至少,如果您不向子类添加任何新属性,您可以简单地要求父类(super class)为您进行打包和解包,因此 super.init(coder: aDecoder)
称呼。如果你的子类比较复杂,你需要为子类添加自己的序列化和反序列化代码。
这与 Visual Studio 的方法形成对比,后者是将代码写入隐藏文件以在运行时生成对象。
关于ios - init coder aDecoder到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386339/
我正在制作一个用于存档书籍的应用程序,我正准备连接一个按钮来保存数据,但我无法通过初始化。 这是 Xcode 给我的错误: Property 'self.bookStore' not initiali
我正在尝试使用以下方式推送 View Controller : var vc2 = ViewController2() self.navigationController?.pushViewContr
我编写了自己的 Button、Textfield、...、类。在“自定义类”的 Storyboard中,我将类设置为 UIElement。这非常有效。 现在我需要一个以编程方式添加的工具栏。当我在我的
也许只有我一个人,但我发现 swift 的某些方面……至少可以说是迟钝。 我大部分时间不使用 Interface Builder,因为我喜欢使用 PureLayout。所以我希望制作一个 UIView
我不认为 public init?(coder aDecoder: NSCoder) 中的问号是关于可选项的。此外,当我覆盖它时,我发现我根本不需要写问号。 那么这到底是什么意思呢? ---更新---
我正在尝试在 viewController 中添加 subview 。为了执行此操作,我创建了一个 xib 文件和关联的类。关联类的代码如下: import UIKit @IBDesignable c
我正在 Swift 中实现一个 Circle 类(UIView 的子类),它根据框架在其初始化程序中设置其 radius像这样传入 init(frame: CGRect): override init
我构建了一个自定义 View 类,它是 UIView 的子类。 此 View 通过 ViewController 中的 nib 文件加载: [[NSBundle main] loadNibNamed:
我不能完全理解我做错了什么。我尝试删除可选 (?) 但没有结果。 这是我的自定义 View 的总代码:- class CustomView: UIView { var vieww: UIVie
简介 我正在尝试调试我的程序,但遇到了一个问题。我收到快速错误:Unexpectedly found nil while unwrapping an optional value. 此问题来自隐式展开
我的 View Controller 中有以下内容: required init(coder aDecoder: NSCoder) { selectedFocusAreas = Array()
我正在尝试在 Swift 中子类化 UITableViewCell。 我已经试过了: class CUISwitchTableViewCell: UITableViewCell { var l
初始化 UIButton 使其在 super.init 行测试中停止。单击继续按钮运行没有问题。为什么 ?我如何才能看到停在那里的原因? required init?(coder aDecoder:
错误是使用 NSCoder 和 NSKeyArchiver 时应用崩溃。 我最近发表了一篇关于 NSCoder 的文章,但从那以后我更改了我的代码并遇到了一个新错误,因此我决定最好还是写一篇新文章。
我有一个核心数据实体Person具有可变形属性 age类型 Age . final class Person: NSManagedObject { @NSManaged public file
我有一个 ViewController,它需要用 ViewModel: NSObject 初始化。 我对 ViewController 的实现是: class ViewController: UIVi
代码: class HeaderView: UIView { @IBOutlet weak var titleLabel: UILabel! required init?(coder aDecoder
当我使用存储属性创建 UIView 或 UIViewController 的子类时,除非我包含 required init 的实现,否则 Xcode 不会编译我的项目?(编码器 aDecoder: N
我知道在反序列化我的对象(在 Storyboard 上创建的)时使用“required init?(coder aDecoder: NSCoder)”,但是在其中初始化 IBOutlets 是否正确?
我是一名优秀的程序员,十分优秀!