You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带有required init(coder:)的自定义类如何跨类调用方法并正确实例化

解决方法

你之前手动创建NSCoder实例传入required init(coder:)的写法本身不符合该初始化方法的设计用途:这个方法是UIKit从Storyboard/XIB中加载视图控制器时自动调用的,依赖UIKit传入的正确解码对象,你自己构造的空NSCoder没有对应的控件配置信息,必然会抛出错误。

根据你的使用场景可以选择以下两种解决方案,均不需要移除已有的required init(coder:)方法:


场景1:MyTabBarCtrl已经在当前App界面中存在(绝大多数情况)

如果你的MyTabBarCtrl是通过Storyboard配置的根标签栏控制器,或者已经被push/present到界面中,不要手动创建新实例,直接获取当前正在使用的实例即可,调用方法后可以直接看到效果:

// 适配全iOS版本获取当前活跃窗口的根控制器
if let window = UIApplication.shared.connectedScenes
    .filter({$0.activationState == .foregroundActive})
    .compactMap({$0 as? UIWindowScene})
    .first?.windows
    .filter({$0.isKeyWindow}).first,
   let tabBarCtrl = window.rootViewController as? MyTabBarCtrl {
    tabBarCtrl.changeFloatingButtonColor()
}

如果你的第二个控制器直接或间接属于MyTabBarCtrl的子控制器,还可以用更简化的写法获取实例:

if let tabBarCtrl = self.tabBarController as? MyTabBarCtrl {
    tabBarCtrl.changeFloatingButtonColor()
}

场景2:需要手动纯代码创建全新的MyTabBarCtrl实例

你只需要给MyTabBarCtrl新增一个自定义便利构造器即可:

// 在MyTabBarCtrl类内部添加以下代码
convenience init() {
    self.init(nibName: nil, bundle: nil)
    // 可在此处添加自定义的初始化配置逻辑
}

之后就可以直接用以下代码实例化并调用公共方法:

let tabInstance = MyTabBarCtrl()
tabInstance.changeFloatingButtonColor()

内容的提问来源于stack exchange,提问作者user7367398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 11:21:02