强制 Nib loader 使用 init?(with:) for custom subclass of NSObject in iOS

Posted

技术标签:

【中文标题】强制 Nib loader 使用 init?(with:) for custom subclass of NSObject in iOS【英文标题】:Forcing Nib loader use init?(with:) for custom subclass of NSObject in iOS 【发布时间】:2017-08-01 17:48:28 【问题描述】:

我添加到一个 XIB 自定义 NSObject,将其类设置为我的符合 NSCoding 协议的 NSObject 子类。通过初始化 UINibLoader 使用 init()。

根据 Apple 在 ios 中的资源编程指南,任何符合 NSCoding 协议的对象都将发送 -initWithCoder: 消息。

是否有可能,如果是如何强制 UIKit 使用 init?(with:) 用于 NSObject 的自定义子类?

UPD:我的班级:

class SomeClass: NSObject, NSCoding 

static var sharedSomeClass: SomeClass = 
    return SomeClass()
()

required init?(coder aDecoder: NSCoder) 
    super.init(coder:aDecoder)


override func encode(with aCoder: NSCoder) 
    super.encode(with: aCoder)


override func awakeAfter(using aDecoder: NSCoder) -> Any? 
    return SomeClassManager.sharedSomeClass


在 XIB 中,我连接到 ViewController 中的 @IBOutlet var someObject: SomeClass!

【问题讨论】:

你能分享你的示例代码吗? @AnandKore 更新问题 【参考方案1】:

试试这个:

要强制它使用另一个 init 方法,请将 -initWithCoder 方法添加到您的子类并覆盖它以调用您自己的 init 方法,如下所示:

Objective-C:(请有人帮我添加到 Swift 的翻译)

-(instancetype)initWithCoder(NSCoder*)aDecoder

    self = [super initWithCoder:aDecoder];

    if(self)
        [self customInit];
    

   return self;

这样当-initWithCoder 被调用时,你的init 方法最终会被调用。对-initWithFrame做同样的事情

【讨论】:

@antonsergeev88 也对-initWithFrame 方法执行相同的覆盖方法

以上是关于强制 Nib loader 使用 init?(with:) for custom subclass of NSObject in iOS的主要内容,如果未能解决你的问题,请参考以下文章

为啥不强制在 NIB 中使用严格的单例应用程序委托对象?

如何在 nib 中传递对对象的 init 方法的引用?

手动加载 nib 文件时未调用 init 或 initWithNibName

为啥不调用基于 nib 的自定义表格单元格的 init 方法

如何在 init 方法中从 NIB 加载 IBOutlets?

从nib实例化UIView会导致无限循环问题