首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在中显示和定位UISwitch或任何UIView

在中显示和定位UISwitch或任何UIView
EN

Stack Overflow用户
提问于 2012-01-26 18:59:53
回答 2查看 731关注 0票数 1

我正在为iOS编写一个简单的Adobe原生扩展。

它所做的一切都显示了一个UISwitch。

然而,当我尝试在那个setFrame (或者这段代码中的任何UIView )上,甚至访问UISwitch的帧时,应用程序都会出现内存访问崩溃。UISwitch本身并不是零,因为在它上调用setOn是有效的,如果我不尝试调用它上的setFrame,或者设置它的中心,或者以任何方式定位它,那么UISwitch就会出现在屏幕上。

这是密码。所讨论的函数是第一个:showSwitch()

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2013-12-05 17:53:15

我有同样的问题来添加一个视图到窗口,经过搜索和测试,我找到了这个解决方案,这可能会帮助任何有同样问题的人。

以下列方式添加您的子视图:

代码语言:javascript
复制
[[[[UIApplication sharedApplication] keyWindow] rootViewController].view addSubview: switchControl];
票数 0
EN

Stack Overflow用户

发布于 2013-12-05 17:59:27

获取AppDelegate (不要忘记包含.h文件)。然后将开关添加到窗口或rootViewController中。

代码语言:javascript
复制
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[app.window addSubview:switchControl];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9023696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档