我正在为iOS编写一个简单的Adobe原生扩展。
它所做的一切都显示了一个UISwitch。
然而,当我尝试在那个setFrame (或者这段代码中的任何UIView )上,甚至访问UISwitch的帧时,应用程序都会出现内存访问崩溃。UISwitch本身并不是零,因为在它上调用setOn是有效的,如果我不尝试调用它上的setFrame,或者设置它的中心,或者以任何方式定位它,那么UISwitch就会出现在屏幕上。
这是密码。所讨论的函数是第一个: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;
}发布于 2013-12-05 17:53:15
我有同样的问题来添加一个视图到窗口,经过搜索和测试,我找到了这个解决方案,这可能会帮助任何有同样问题的人。
以下列方式添加您的子视图:
[[[[UIApplication sharedApplication] keyWindow] rootViewController].view addSubview: switchControl];发布于 2013-12-05 17:59:27
获取AppDelegate (不要忘记包含.h文件)。然后将开关添加到窗口或rootViewController中。
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[app.window addSubview:switchControl];https://stackoverflow.com/questions/9023696
复制相似问题