【问题标题】:Function in Appcelerator causing issues when called quicklyAppcelerator 中的函数在快速调用时会导致问题
【发布时间】:2014-01-29 14:15:17
【问题描述】:

我在使用 Appcelerator Titanium 构建的 iOS 应用上的最后几部分遇到了一些问题。

下面的应用示例显示了我的一个窗口,它允许用户点击一个视图(其中包含一个单词),该视图会翻转以以不同的语言显示相同的单词。然后,用户可以再次点击相同的视图,它会动画回到显示原始单词的原始位置。

当用户想要移动到另一个词时,他们只需在视图上滑动,它就会引入下一个词。

这是我遇到的问题;

  1. 如果用户在大量单词中快速滑动,然后点击翻转,则会崩溃。
  2. 如果用户点击视图来翻转视图,有时第二个单词会在动画发生之前闪现,它应该只在视图进入视图时才能看到。

3) 用户可以选择删除单词,点击它会执行数据库更新,然后重新加载函数并带入一个新单词。非常适合您第一次使用它,但在第 2、第 3、第 4 次使用时间,警报框会弹出多次而不是一次。

现在,我怀疑我在这里做错了,但我无法解决,我已经移动了代码以确保标签不会在它们应该显示之前显示出来,但它一直在发生。

谁能阐明我的一点或全部观点?我快疯了!

我正在使用适用于 iOS 的 Titanium 3.20

非常感谢

西蒙

var win = Titanium.UI.currentWindow;

var selectedlanguage = Ti.App.Properties.getString('langSelect');

// detect height
if (Titanium.Platform.displayCaps.platformHeight == 480) {
    var MVTOP = 115;
    var tapTOP = 83;
    var swipeTOP = 275;
} else {
    var MVTOP = 165;
    var tapTOP = 133;
    var swipeTOP = 325;
}

var masterView = Ti.UI.createView({
    backgroundColor: '#FFF',
    top: MVTOP,
    width: 300,
    height: 140,
    opacity: 0.7
});

var state = true;


win.add(masterView);

var front = Ti.UI.createView({
    backgroundColor: '#FFF',
    top: 0,
    left: 0,
    width: 300,
    height: 140,
    opacity: 1.0,
    touchEnabled: false
});

var back = Titanium.UI.createView({
    backgroundColor: '#FFF',
    top: 0,
    left: 0,
    width: 300,
    height: 140,
    opacity: 1.0,
    touchEnabled: false
});


if (win.section == 'word_expressions') {
    var label1 = Ti.UI.createLabel({
        //text: verb_german,
        text: '',
        textAlign: 'center',
        color: '#000',
        font: {
            fontSize: 20
        },
        top: 50
    });

    var label2 = Ti.UI.createLabel({
        //text: verb_english,
        text: '',
        textAlign: 'center',
        color: '#000',
        font: {
            fontSize: 20
        },
        top: 50
    });

} else {
    var label1 = Ti.UI.createLabel({
        //text: verb_german,
        text: '',
        textAlign: 'center',
        color: '#000',
        font: {
            fontSize: 30
        },
        top: 50
    });

    var label2 = Ti.UI.createLabel({
        //text: verb_english,
        text: '',
        textAlign: 'center',
        color: '#000',
        font: {
            fontSize: 30
        },
        top: 50
    });
}



var dropButton = Ti.UI.createButton({
    width: 120,
    height: 41,
    right: 15,
    bottom: 15,
    title: 'drop word',
    backgroundColor: '#fd0100',
    color: '#FFF',
    font: {
        fontSize: 15
    },
    opacity: 1.0
});
win.add(dropButton);


function loadWords() {

    // get the section to query for the database
    var wordSection = win.section;

    // get a random pair of words
    var db = Ti.Database.open('germanV6');

    var rows = db.execute('SELECT * FROM Words WHERE ' + wordSection + ' = 1 AND word_dropped = 0 ORDER BY RANDOM() LIMIT 1');

    var x = 0;
    while (rows.isValidRow()) {

        if (selectedlanguage == 'en') {
            var word_1 = rows.fieldByName('word_english');
            var word_2 = rows.fieldByName('word_german');
        } else if (selectedlanguage == 'de') {
            var word_2 = rows.fieldByName('word_english');
            var word_1 = rows.fieldByName('word_german');
        }
        var word_id = rows.fieldByName('word_id');

        rows.next();
    }

    // close database
    rows.close();



    var state = true;

    label1.text = word_1;

    front.add(label1);
    masterView.add(front);



    label2.text = word_2;

    back.add(label2);


    masterView.addEventListener('click', function (e) {
        switch (state) {
        case true:
            Ti.API.info('true');
            masterView.animate({
                view: back,
                transition: Ti.UI.iPhone.AnimationStyle.FLIP_FROM_LEFT
            });
            break;
        case false:
            Ti.API.info('false');
            label1.text = word_1;
            masterView.animate({
                view: front,
                transition: Ti.UI.iPhone.AnimationStyle.FLIP_FROM_RIGHT
            });
            break;
        }
        state = !state;
    });



    var eventListener = function () {
        // update the DB to tell it the word has been dropped
        var dbDelete = Ti.Database.open('germanV6');
        var rowsDelete = dbDelete.execute('UPDATE Words SET word_dropped=1 WHERE word_id=' + word_id);


        // pop an alert to notify the user the word has been dropped
        var alertDialog = Titanium.UI.createAlertDialog({
            title: 'Word Dropped',
            message: 'This word has been dropped!' + word_id,
            buttonNames: ['OK']
        });
        // show the message
        alertDialog.show();

        // load in a new word
        //loadWords();
        alertDialog.addEventListener('click', function (j) {
            loadWords();
        });
    };

}

// fire the function and load our words into play
loadWords();


var tapLabel = Ti.UI.createLabel({
    width: 200,
    top: tapTOP,
    text: 'tap to flip',
    textAlign: 'center',
    color: '#FFF',
    font: {
        fontSize: 15
    }
});

var swipeLabel = Ti.UI.createLabel({
    width: 320,
    top: swipeTOP,
    text: 'swipe for next word',
    textAlign: 'center',
    color: '#FFF',
    font: {
        fontSize: 15
    }
});

win.add(tapLabel);
win.add(swipeLabel);


var grammarButton = Ti.UI.createButton({
    width: 120,
    height: 41,
    left: 15,
    bottom: 15,
    title: 'verb tables',
    backgroundColor: '#ffff01',
    color: '#000',
    font: {
        fontSize: 15
    },
    opacity: 1.0
});

win.add(grammarButton);




swipeLabel.addEventListener('swipe', function (e) {

    // reload the new word
    loadWords();

});


masterView.addEventListener('swipe', function (e) {


    // reload the new word
    loadWords();

});

grammarButton.addEventListener('click', function (e) {
    var newWin = Titanium.UI.createWindow({
        url: 'verb_table.js',
        backgroundImage: '/images/background_random.jpg',
        backgroundColor: '#FFF',
        barColor: '#000',
        translucent: true,
        color: '#FFF',
        navTintColor: '#FFF',
        titleControl: Ti.UI.createLabel({
            text: 'Verb Table',
            color: '#FFF'
        }),
        statusBarStyle: Titanium.UI.iPhone.StatusBar.LIGHT_CONTENT,
        backButtonTitle: ''
    });
    newWin.nav = win.nav;
    win.nav.openWindow(newWin, {
        animated: true
    });
});

【问题讨论】:

    标签: ios function animation titanium appcelerator


    【解决方案1】:

    loadWords() 每次调用时都会向 masterView 添加一个事件侦听器。应该是坠机的源头。 Ti.API.info 调用是否会随着使用应用程序的时间而增加?我希望您应该看到它在运行时会弹出 1,然后是 2,然后是 3...。

    是否缺少代码? eventListener 函数已定义,但我找不到调用它的位置。然后,此函数有另一个侦听器,然后再次调用 loadWords 添加更多侦听器。函数 eventListener 的名称很难查找,因为所有 addEventListener 引用都出现在搜索中,因为它们匹配。我会将该函数的名称更改为更独特的名称。它可能会在那里被调用,但我放弃了寻找它。

    这段代码有问题。我希望 var label1 和 var label2 不是您稍后要添加到视图中的那些,但我希望它们在离开您的块 {} 时超出范围。我会将 var label1 和 var label2 移到 if-else 之外,并且只有 label1 = Ti.UI... 和 label2 = Ti.UI.. 在那里。

    var label1;
    var label2;
    if (win.section == 'word_expressions') {
        label1 = Ti.UI.createLabel({ // FIX
            //text: verb_german,
            text: '',
            textAlign: 'center',
            color: '#000',
            font: {
                fontSize: 20
            },
            top: 50
        });
    
        label2 = Ti.UI.createLabel({  // FIX
            //text: verb_english,
            text: '',
            textAlign: 'center',
            color: '#000',
            font: {
                fontSize: 20
            },
            top: 50
        });
    
    } else {
        label1 = Ti.UI.createLabel({  // FIX
            //text: verb_german,
            text: '',
            textAlign: 'center',
            color: '#000',
            font: {
                fontSize: 30
            },
            top: 50
        });
    
        label2 = Ti.UI.createLabel({ // FIX 
            //text: verb_english,
            text: '',
            textAlign: 'center',
            color: '#000',
            font: {
                fontSize: 30
            },
            top: 50
        });
    }
    front.add(label1);
    back.add(label2);
    

    可变范围 http://msdn.microsoft.com/en-us/library/bzt2dkta(v=vs.94).aspx

    我会说你需要重新考虑 loadWords 函数。它可能做得太多,是所有问题的根源。 masterView.addEventListener 应该被移出。 alertDialog 也应该以不同的方式设置。也许移动该代码以在全功能 loadWords 之外生成警报。

    数据库在 loadWords 中反复打开,但从未关闭。您确实关闭了该行,但忘记了数据库。

    front.add 和 back.add 在 loadWords 函数中不是必需的,您应该在定义它们的 If-Else 语句之后使用它们。将更新的代码保存在那里,它们的 .text 属性。

    仔细查看标签定义,除了字体大小之外,它们的定义完全相同。我会解决这个问题,只更改 IF-ELSE 内的字体。

    修复您检测高度的位置。将所有 var [变量名] 移出块并定义一次。然后在 IF-ELSE 中为它们分配正确的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 2014-05-03
      • 2022-08-19
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多