2012-01-26 10 views
1

iOS向けの簡単なAdobeネイティブ拡張を作成しています。iOS用Adobe Native ExtensionのUISwitchまたは任意のUIViewの表示と配置

すべては、UISwitchを表示します。

しかし、私はそのUISwitch(またはこのコードの任意のUIView)でフレームを設定しようとすると、またはUISwitchのフレームにアクセスすると、不正なメモリアクセスクラッシュでアプリケーションsegfaults。 UISwitch自体は、その上にsetOnが呼び出され、setFrameをコールしたり、そのセンターを設定したり、何らかの方法で配置したりしないと、UISwitchが画面に表示されるため、nilではありません。

ここにコードがあります。 showSwitch()

#import "FlashRuntimeExtensions.h" 
#import <UIKit/UIKit.h> 

FREObject showSwitch(FREContext context, 
        void* functionData, 
        uint32_t argc, 
        FREObject argv[]) 
{ 
    int32_t isOn; 
    FREGetObjectAsInt32(argv[0], &isOn); 

    id delegate = [[UIApplication sharedApplication] delegate]; 
    UIWindow* window = [delegate window]; 

    // The following will segfault 
    // UISwitch* switchControl = [[[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)]; 

    // This works fine. 
    UISwitch* switchControl = [[[UISwitch alloc] init] retain]; 

    // This will segfault as well 
    // [switchControl setFrame:CGRectMake(100, 100, switchControl.frame.size.width, switchControl.frame.size.height)]; 

    [switchControl setOn:(isOn == 1)]; // switchControl is not nil, because this works. 
    [window addSubview:switchControl]; 

    return NULL; 
} 

void ContextFinalizer(FREContext context) 
{ 
    return; 
} 

void ContextInitializer(void* extensionData, 
         const uint8_t* contextType, 
         FREContext context, 
         uint32_t* numFunctionsToTest, 
         const FRENamedFunction** functionsToSet) 
{ 
    *numFunctionsToTest = 1; 

    FRENamedFunction* function = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1); 
    function[0].name = (const uint8_t*)"showSwitch"; 
    function[0].functionData = NULL; 
    function[0].function = &showSwitch; 

    *functionsToSet = function; 

} 

void ExtensionInitializer(void** extensionDataToSet, 
          FREContextInitializer* contextInitializerToSet, 
          FREContextFinalizer* contextFinalizerToSet) 
{ 
    *extensionDataToSet = NULL; 
    *contextInitializerToSet = &ContextInitializer; 
    *contextFinalizerToSet = &ContextFinalizer; 
} 

void ExtensionFinalizer(void* extensionData) 
{ 
    return; 
} 

答えて

0

私はこの解決策を見つけた多くのウィンドウにビューを追加し、検索後およびテストするために同じ問題を抱えていた、誰が助けることがあります。問題の関数は、最初の1であります同じ問題があります。

はあなたのサブビューこの方法を追加します。

[[[[UIApplication sharedApplication] keyWindow] rootViewController].view addSubview: switchControl]; 
0

は(.hファイルを含めることを忘れないでください)AppDelegateを取得します。次に、スイッチをウィンドウまたはrootViewControllerに追加します。

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[app.window addSubview:switchControl]; 
関連する問題