Отображение и позиционирование UISwitch или любого UIView в расширении Adobe Native для iOS - PullRequest
1 голос
/ 26 января 2012

Я пишу простое собственное расширение Adobe для iOS.

Все, что он делает, показывает UISwitch.

Однако, когда я пытаюсь установить Frame на этот UISwitch (или любой UIView в этомчасть кода), или даже получить доступ к фрейму UISwitch, приложение завершается ошибкой при сбое доступа к памяти.Сам UISwitch НЕ равен nil, потому что вызов setOn для него работает, и UISwitch действительно появляется на экране, если я не пытаюсь вызвать setFrame для него, или установить его центр, или расположить его втем не мение.

Вот код.Рассматриваемая функция является первой: 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;
}

Ответы [ 2 ]

0 голосов
/ 05 декабря 2013

Получить AppDelegate (не забудьте включить файл .h).Затем вы добавляете свой переключатель в окно или в rootViewController.

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[app.window addSubview:switchControl];
0 голосов
/ 05 декабря 2013

У меня была такая же проблема, чтобы добавить представление в окно, и после многократного поиска и тестирования я нашел это решение, которое может помочь любому с такой же проблемой.

Добавьте свое подпредставление следующим образом:

[[[[UIApplication sharedApplication] keyWindow] rootViewController].view addSubview: switchControl];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...