- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试使用 Typhoon 将依赖注入(inject)添加到我的应用程序中,该应用程序现在一半是 Swift,一半是遗留的 Objective-C。我正在尝试从我的程序集中的 Storyboard实例化 View Controller ,但在下面的崩溃中运行。我在这里阅读https://github.com/appsquickly/Typhoon/issues/293使用 NSString 可以解决问题,但正如您在下面看到的那样,我已经这样做了,但并没有太大帮助……有什么想法吗?
dynamic func typhoonStoryboard(name: NSString) -> AnyObject {
return TyphoonDefinition.withClass(TyphoonStoryboard.self, configuration: { (definition) -> Void in
definition.useInitializer("storyboardWithName:factory:bundle:", parameters: { (initializer) -> Void in
initializer.injectParameterWith(name)
initializer.injectParameterWith(self)
initializer.injectParameterWith(NSBundle.mainBundle())
})
})
}
dynamic func viewController(withStoryboardName storyboardName: NSString, storyboardIdentifier: NSString) -> AnyObject {
return TyphoonDefinition.withFactory(self.typhoonStoryboard(NSString(string: storyboardName)), selector: "instantiateViewControllerWithIdentifier:", parameters: { (method) -> Void in
method.injectParameterWith(NSString(string: storyboardIdentifier))
}, configuration: { (definition) -> Void in
})
}
知道哪里出了问题吗?如您所见,我已经在使用 NSString 进行变通,但它仍然因以下异常异常而崩溃...
2015-09-15 09:26:32.484 MyApp[64855:5393006] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'You can't call a method on the runtime argument being passed in. It has to be passed in as-is'
*** First throw call stack:
(
0 CoreFoundation 0x000000010ae0ff65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010a42edeb objc_exception_throw + 48
2 CoreFoundation 0x000000010ae0fe9d +[NSException raise:format:] + 205
3 MyApp 0x00000001052282b3 -[TyphoonInjectionByRuntimeArgument forwardingTargetForSelector:] + 67
4 CoreFoundation 0x000000010ad65c4e ___forwarding___ + 158
5 CoreFoundation 0x000000010ad65b28 _CF_forwarding_prep_0 + 120
6 libswiftCore.dylib 0x000000010bff54b3 _TTSf4g_d___TFSSCfMSSFT12_cocoaStringPSs9AnyObject__SS + 131
7 libswiftCore.dylib 0x000000010bfbce33 _TFSSCfMSSFT12_cocoaStringPSs9AnyObject__SS + 19
8 libswiftFoundation.dylib 0x000000010c3e0af9 _TToFE10FoundationCSo8NSStringcfMS0_FT6stringS0__S0_ + 41
9 libswiftFoundation.dylib 0x000000010c3e0a3a _TFE10FoundationCSo8NSStringCfMS0_FT6stringS0__S0_ + 58
10 MyApp 0x0000000104cc890d _TFC8MyApp22ViewControllerAssembly14viewControllerfS0_FT18withStoryboardNameCSo8NSString20storyboardIdentifierS1__PSs9AnyObject_ + 157
11 MyApp 0x0000000104cc90cf _TToFC8MyApp22ViewControllerAssembly14viewControllerfS0_FT18withStoryboardNameCSo8NSString20storyboardIdentifierS1__PSs9AnyObject_ + 79
12 CoreFoundation 0x000000010acfe85c __invoking___ + 140
13 CoreFoundation 0x000000010acfe6ae -[NSInvocation invoke] + 286
14 CoreFoundation 0x000000010ad8f016 -[NSInvocation invokeWithTarget:] + 54
15 MyApp 0x000000010520ea76 objc_msgSend_InjectionArguments + 454
16 MyApp 0x000000010520e83e -[TyphoonAssemblyDefinitionBuilder definitionForKey:] + 254
17 MyApp 0x000000010520e61f -[TyphoonAssemblyDefinitionBuilder populateCacheWithDefinitionForKey:] + 111
18 MyApp 0x000000010520e01b -[TyphoonAssemblyDefinitionBuilder builtDefinitionForKey:args:] + 203
19 MyApp 0x000000010520df20 -[TyphoonAssemblyDefinitionBuilder buildDefinitionForKey:] + 64
20 MyApp 0x000000010520de43 __49-[TyphoonAssemblyDefinitionBuilder populateCache]_block_invoke + 163
21 CoreFoundation 0x000000010ad6f0df __51-[__NSSetM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 79
22 CoreFoundation 0x000000010ad6efea -[__NSSetM enumerateObjectsWithOptions:usingBlock:] + 202
23 MyApp 0x000000010520dd69 -[TyphoonAssemblyDefinitionBuilder populateCache] + 185
24 MyApp 0x000000010520dc1a -[TyphoonAssemblyDefinitionBuilder builtDefinitions] + 74
25 MyApp 0x000000010520a976 -[TyphoonAssembly definitions] + 54
26 MyApp 0x000000010520ff1a -[TyphoonBlockComponentFactory registerAllDefinitions:] + 90
27 MyApp 0x000000010520fd78 -[TyphoonBlockComponentFactory buildAssembly:] + 104
28 MyApp 0x000000010520fc10 -[TyphoonBlockComponentFactory initWithAssemblies:] + 544
29 MyApp 0x000000010520f8b7 +[TyphoonBlockComponentFactory factoryWithAssemblies:] + 87
30 MyApp 0x00000001052340d2 +[TyphoonStartup requireInitialFactory] + 194
31 MyApp 0x00000001052345ad __60+[TyphoonStartup swizzleSetDelegateMethodOnApplicationClass]_block_invoke + 93
32 UIKit 0x0000000108a8825b -[UIApplication _setDelegate:assumeOwnership:] + 51
33 UIKit 0x0000000108a93cea _UIApplicationMainPreparations + 1618
34 UIKit 0x0000000108a93647 UIApplicationMain + 124
35 MyApp 0x0000000104b1f80f main + 111
36 libdyld.dylib 0x000000010c5a492d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
最佳答案
Typhoon 是一个相当典型的内省(introspection)和反射类型的 DI 容器,针对 Objective-C 进行了优化。 (也适用于 Swift)。
获取组件:
Rules parsed on startup->post processing->factory emits built objects
因此:在运行时参数的情况下,我们不能对它们调用任何方法,或者在传入后以其他方式操作它们,因为这与 Typhoon 构建对象实例化蓝图时的启动阶段无关。
如果您声明 NSString 类型的运行时参数,并直接传递它而不进行操作(而不是 NSString(string: storyboardIdentifier)
),它应该可以正常工作。
关于ios - 台风 + swift : Crash when using run-time arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580206/
我在我的应用程序中使用 Storyboard。当我第一次开始集成 Typhoon 时,我在 plist 中列出了程序集,如下所示: TyphoonInitialAssemblies Appl
我正在尝试通过 Typhoeus on Rails 连接到 WebService,并且响应给了我一个代码 0。 它告诉我发生了 ssl_connect_error。 Typhoeus 的文档说要阅读消
我对台风有疑问。我想使用 Storyboard集成,所以我在 plist 中设置了正确的 Storyboard名称,并为 Storyboard中的每个 View Controller 定义了“typh
是否可以即时激活额外的程序集? 例如,在 Info.plist 中,我有两个程序集:UIAssembly 和 ServicesComponents。 除此之外,我还有多个 Storyboard,每个
我正在尝试手动实例化 Initial viewControllers 并坚持下一步。 这是有效的: -(TyphoonStoryboard *)storyboard { return [Typ
我正在 plist 中配置初始程序集,用于实例化 Storyboard中的第一个 Controller 。 稍后在应用程序中,我将使用以下方法更改 Root View Controller : Ty
在我逐步引入 Typhoon 的遗留应用程序中,如果我想从一个本身不是从 Typhoon 实例化的类中实例化 Typhoon 的实例,我可以在我的 AppDelegate 中放置以下内容: [self
我在一个 swift 项目中使用台风,据我所知,我必须像这样在 TyphoonAssembly 中显式映射所有注入(inject): public dynamic func appDelegate(
我有一个在几个地方注入(inject)的 A 类。我想在任何地方注入(inject)相同的 A 实例 - 有点像 Singleton,但需要注入(inject)。 有没有可能用台风做到这一点 最佳答案
我试图弄清楚如何在创建单例时将运行时参数注入(inject)到单例中,然后从那时起记住这些参数。不过,我不确定运行时参数的接口(interface)是否可以支持这一点。比如说,我有一个需要 token
我已经检查了让程序集实现协议(protocol)并将程序集作为属性注入(inject)到需要实现该协议(protocol)的 View Controller 的想法。这在这里解释:https://gi
我有一个用 Swift 编写的第三方库。该库提供了一个类,其中包含一些类方法。使用 Typhoon,我想将该类注入(inject)到我的一个类中,以便在单元测试下,我可以注入(inject)一个提供假
我如何将 Typhoon 与系统隐式生成 View Controller 的 iOS Storyboard一起使用?我是否必须在 prepareForSegue 方法中做一些特殊的事情? 最佳答案 积
我正在使用 Typhoon 进行依赖注入(inject)。但我有一个问题。偶尔,我会遇到以下异常: Terminating app due to uncaught exception 'NSInval
我在 Typhoon 中定义了一个 ApplicationAssembly。 所以我想做的是说:“这个类 X 需要注入(inject)符合 Foo 协议(protocol)的东西。这是一个 RealF
我目前正在尝试使用 Typhoon 将依赖注入(inject)添加到我的应用程序中,该应用程序现在一半是 Swift,一半是遗留的 Objective-C。我正在尝试从我的程序集中的 Storyboa
我有一个 Storyboard,其中有一个 View 使用 socket 连接到他的 Controller 。在同一个 Controller 中,我想注入(inject)一个需要访问该 View 的对
当使用手工制作的容器/注入(inject)器负责创建和管理我图中对象的生命周期时,我使用以下模式(我在一篇关于 ObjC 中的 DIY DI 的文章中读到): 假设我们有一个 Root View Co
我在 Xcode(OS X、Swift、Storyboards)中有一个干净的 OS X 项目。 Info.plist 有如下配置 这是 MyAssembly.sift 中 View Controll
我是一名优秀的程序员,十分优秀!