gpt4 book ai didi

ios - 台风:从程序集中检索 Storyboard 时出现异常

转载 作者:可可西里 更新时间:2023-11-01 01:41:44 26 4
gpt4 key购买 nike

我正在使用 Typhoon 进行依赖注入(inject)。但我有一个问题。偶尔,我会遇到以下异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'No component matching id 'nemIdStoryboard'.'

发生此异常的代码如下所示:

class PaymentApproveViewController : UIViewController {
var assembly : ApplicationAssembly!
//...
private func signPayment() {
let storyboard = assembly.nemIdStoryboard()
let controller = storyboard.instantiateInitialViewController() as NemIDViewController
//...
}
}

我的汇编代码是这样的:

public dynamic func rootViewController() -> AnyObject {
return TyphoonDefinition.withClass(RootViewController.self) {
$0.injectProperty("assembly", with: self)
}
}

public dynamic func paymentApproveViewController() -> AnyObject {
return TyphoonDefinition.withClass(PaymentApproveViewController.self) {
$0.injectProperty("assembly", with: self)
}
}
public dynamic func nemIdStoryboard() -> AnyObject {
return TyphoonDefinition.withClass(TyphoonStoryboard.self) {
$0.useInitializer("storyboardWithName:factory:bundle:") {
$0.injectParameterWith("NemID")
$0.injectParameterWith(TyphoonBlockComponentFactory(assembly:self))
$0.injectParameterWith(nil)
}
}
}

我有完全相同的代码将程序集注入(inject)我的 RootViewController,它还检索 Storyboard并以与上述相同的方式实例化 View Controller 。但这永远不会失败。

我无法确定为什么这会偶尔失败并且不一致的任何原因。但我有一种感觉,程序集可能无法在使用可选类型的 Swift 代码中正确初始化。难道是这样吗?或者你能建议我做些什么来使这段代码工作吗?

编辑:

我已经从 rootViewController 和 PaymentApproveViewController 打印出 TyphoonComponentFactory._registry。有趣的结果是:

  • 在 RootViewController 中,_registry 包含我的 ApplicationAssembly 中所有台风定义的列表。即所有对象和 Storyboard定义
  • 在 PaymentApproveViewController 中,_registry 包含所有对象除了我的五个 Storyboard。这就是 TyphoonComponentFactory.componentForKey 在找不到 Storyboard时抛出异常的原因。

顺便说一句:程序集的地址在 rootViewControllerPaymentApproveViewController 中是不同的。所以注入(inject)的是两个不同的程序集。这可以避免吗,还是预期的行为?

最佳答案

看起来问题在于:

$0.injectParameterWith(TyphoonBlockComponentFactory(assembly:self))

这是仅使用在当前程序集中找到的定义来实例化一个新程序集,并跳过任何协作程序集。你实际上想要:

$0.injectParameterWith(self)

在 Objective-C 中,可以将任何 TyphoonAssembly 转换为 TyphoonComponentFactory(在运行时,您的程序集只是 TyphoonComponentFactory 的一个实例,冒充在任何情况下组装)。使用 Swift 的严格类型检查这是不可能的,所以改为 Typhoon 3.0 具有符合 TyphoonComponentFactory 协议(protocol)的 TyphoonAssembly 类,因此如果您需要来自该接口(interface)的任何方法,它们都可用。例如:

assembly.componentForType(SomeType.self)

总结

  • 在 Swift 中,我们只注入(inject) TyphoonAssembly 而不是 TyphoonComponentFactory
  • TyphoonAssembly 符合 TyphoonComponentFactory 协议(protocol)。

关于ios - 台风:从程序集中检索 Storyboard 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com