带有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
相关产品推荐
相关产品推荐

