Ios7 使用Tianium SDK 3.2.0.GA在iOS 7.1中显示重复的optionDialog

Ios7 使用Tianium SDK 3.2.0.GA在iOS 7.1中显示重复的optionDialog,ios7,titanium,titanium-mobile,appcelerator-mobile,Ios7,Titanium,Titanium Mobile,Appcelerator Mobile,我使用的是Tianium SDK 3.2.0.GA,Tianium Studio 3.2.0,iOS SDK是7.0.3,我正在使用7.1.1部署到n iPad上 每次我在应用程序中显示optionDialog时,也会显示一个重复的选项列表,就好像对话框上显示了两个滚动视图一样,可以看出创建了一个重复的选项列表,因为如果我尝试滚动optionDialog,其中一个滚动视图正在滚动,而另一个在后台保持静止 我确保只创建了一个optionDialog,这是我的代码: function setMult

我使用的是Tianium SDK 3.2.0.GA,Tianium Studio 3.2.0,iOS SDK是7.0.3,我正在使用7.1.1部署到n iPad上

每次我在应用程序中显示optionDialog时,也会显示一个重复的选项列表,就好像对话框上显示了两个滚动视图一样,可以看出创建了一个重复的选项列表,因为如果我尝试滚动optionDialog,其中一个滚动视图正在滚动,而另一个在后台保持静止

我确保只创建了一个optionDialog,这是我的代码:

function setMultiOptions()
{
    // se crea un option dialog nuevo cada vez que se cambien los options
    var optionDialog = Ti.UI.createOptionDialog({
        title : 'Selecciona una opción:',
        options : extraMultiOptions,
        cancel : parseInt(extraMultiOptions.length - 1)
    });
    optionDialog.addEventListener('click', function(e){
        // si el indice seleccionado no es el de cancelar, procede con la seleccion de la opcion
        if(e.index !== parseInt(extraMultiOptions.length - 1))
        {
            $.ExtraMultiOptionValue.text = extraMultiOptions[e.index];
            extraValue = extraMultiOptions[e.index]; 
            if(extraName === 'Entidades')
            {
                Alloy.Globals.GlobalFunctions.ClearCP();
                Alloy.Globals.GlobalFunctions.GetMunicipios(e.index + 1);
            }
            else if(extraName === 'Municipios')
            {
                Alloy.Globals.GlobalFunctions.ClearCP();
            }
        }// de lo contrario, limpia el campo y la variable de value
        else
        {
            $.ExtraMultiOptionValue.setText('');
            extraValue = '';
        }
    });
    // si hay options,  gestiona el comportamiento
    if(extraMultiOptions.length > 0)
    {
        // si son entidades, asigna un evento unico para el campo 
        if(extraName === 'Entidades')
        {
            singletapCallback = function(e){
                $.ShowMultiOptionView.animate({
                    backgroundColor : categoryColor
                }, function(){
                    $.ShowMultiOptionView.animate({
                        backgroundColor : 'transparent'
                    });
                });
                optionDialog.show();
            };
            $.ExtraMultiOptionData.addEventListener('singletap', singletapCallback);
        } // si son municipios, reemplaza la funcion global para el contexto nuevo (municipios cambian en base a entidad, por lo tanto el contexto en municipios siempre cambia y no es unico)
        else if(extraName === 'Municipios')
        {
            Alloy.Globals.GlobalFunctions.SingletapHandler = function(e){
                Ti.API.info('single tap handler');
                $.ShowMultiOptionView.animate({
                    backgroundColor : categoryColor
                }, function(){
                    $.ShowMultiOptionView.animate({
                        backgroundColor : 'transparent'
                    });
                });
                optionDialog.show();
            };
            if(!singletapAdded)
            {
                Ti.API.info('event is not added yet, adding now...');
                singletapAdded = true;
                $.ExtraMultiOptionData.addEventListener('singletap', function(e){
                    if(canShowDialog)
                    {
                        Alloy.Globals.GlobalFunctions.SingletapHandler();
                    }
                });
            }
            else
            {
                Ti.API.info('event has been added');
            }
        } // si no es ni entidad ni municipio, agrega un evento sin nombre
        else
        {
            $.ExtraMultiOptionData.addEventListener('singletap', function(e){

                $.ShowMultiOptionView.animate({
                    backgroundColor : categoryColor
                }, function(){
                    $.ShowMultiOptionView.animate({
                        backgroundColor : 'transparent'
                    });
                });
                optionDialog.show();
            });
        }
    }
}
在我的函数中,我创建了一个充满选项数组的optionDialog实例,设置了它的click事件,然后检查选项的数量是否大于0,然后检查名为extraName的变量的值,该变量指示optionDialog中存在何种选项。如果extraName的值为“Entidades”,我将向显示optionDialog的视图添加一个唯一的singletap事件,如果值为“市政”,我将覆盖一个全局函数,并仅将singletap事件一次分配给显示optionDialog的视图,该事件调用全局函数,该函数将根据为optionDialog发送的选项进行更改。如果extraName的值既不是“Entidades”也不是“市政”,那么我将向singletap事件添加一个匿名函数

在每种情况下,我都添加了信息来检查singletap事件是否被添加了不止一次,但该事件只被添加了一次

出于某种原因,optionDialog显示为两个滚动视图,其中包含选项,我还没有找到解释为什么会发生这种情况,或者为什么会发生这种情况

我留下这个截图


我要尝试的第一件事是在函数外部删除optionDialog的实例化和事件处理程序。您不需要在该函数中使用它,而且它将简化调试。我以前遇到过类似的情况,它在创建时调用事件处理程序。只是一个想法

接下来,我会考虑把一个大的选项列表放在一个表中而不是optScript对话框。


让我知道这是否有帮助。

解决方案是从3.2.0开始添加了一个名为opaquebackground的新属性,在iPad上必须设置为true以避免此问题

遗憾的是,在文档开始时,文档没有在特定于平台的注意事项上警告您,因此很容易遗漏,因为文档中的所有属性都已折叠

更糟糕的是,谷歌搜索Tianium Option Dialog ghost或Tianium Option Dialog duplicate根本无法将您指向此属性,您必须使用确切的单词ghosting,这对我们中许多非英语母语的人来说确实是陌生的

我打开了一张JIRA通知单,要求更新文档,但让我们看看他们是否介意,因为我得到的回复有点咄咄逼人。查一下JIRA的票