Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 台风&x2B;Swift:使用运行时参数时崩溃_Ios_Swift_Code Injection_Swift2_Typhoon - Fatal编程技术网

Ios 台风&x2B;Swift:使用运行时参数时崩溃

Ios 台风&x2B;Swift:使用运行时参数时崩溃,ios,swift,code-injection,swift2,typhoon,Ios,Swift,Code Injection,Swift2,Typhoon,我目前正在尝试将依赖注入添加到我的应用程序中,该应用程序现在是一半快速,一半传统的Objective-C。我正在尝试从我的程序集中的故事板实例化一个视图控制器,但在下面的崩溃中运行。我在这里读到,使用NSString可以解决这个问题,但正如您在下面看到的,我已经这样做了,它并没有太大的帮助。。。有什么想法吗 dynamic func typhoonStoryboard(name: NSString) -> AnyObject { return TyphoonDefiniti

我目前正在尝试将依赖注入添加到我的应用程序中,该应用程序现在是一半快速,一半传统的Objective-C。我正在尝试从我的程序集中的故事板实例化一个视图控制器,但在下面的崩溃中运行。我在这里读到,使用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

台风是一个非常典型的内省型和反射型DI容器,针对Objective-C进行了优化(也适用于Swift)

  • 启动时:从所有程序集中收集有关如何构建对象的信息
  • 运行时:程序集接口位于TyphonComponentFactory前面,该工厂知道如何根据所有收集的规则发出组件
要获取组件,请执行以下操作:

Rules parsed on startup->post processing->factory emits built objects
因此:对于运行时参数,我们不能对其调用任何方法,也不能在传入后对其进行操作,因为这与Typhone构建对象实例化蓝图时的启动阶段无关


如果声明NSString类型的运行时参数,并直接传递它而不进行任何操作(而不是
NSString(string:storyboardIdentifier)
),它应该可以正常工作

谢谢,真是太棒了!还有很好的解释:)