连续多个对象的事件侦听器

时间:2014-05-14 17:39:50

标签: javascript ios titanium

我正在构建一个Titanium iOS应用程序。我有一个tableview,每行有两个图像和一些其他标签。我希望能够点击每个图像并交换其他图像,我希望能够点击像电话号码这样的标签并调出拨号器。到目前为止,行中任意位置的单击都会交换图像。以下是我的一些代码:

//First I create my table and then call a php file to return some JSON data, then I create my row and define an image

row = Ti.UI.createTableViewRow({
    backgroundImage : 'images/openmatchesrowbackground.png',
    selectionStyle : Titanium.UI.iPhone.TableViewCellSelectionStyle.NONE,
    width : '100%',
    height : '180pt',
    rowId : i
    });

    var acceptmatchView = Ti.UI.createView({
        left : '0pt',
        top : '0pt',
        width : '60pt',
        height : '60pt'
        });

    var acceptmatch = Ti.UI.createImageView({
        image : 'images/nomatch.png',
        left : '0pt',
        top : '0pt',
        width : '60pt',
        action: 'swapImages',
        height : '60pt'
        });

//Then I add some labels and add everything to the row - Now create my event listener

        tableview.addEventListener('click', function(e) {
        var imageView = e.row.children[0].children[0];

    if (imageView.image == 'images/nomatch.png') {
        imageView.image = 'images/match.png';

    var matchSelected = json.openmatches[e.rowData.rowId];

        var alertWindow = Titanium.UI.createAlertDialog({
            title : 'Accept This Match?',
            message : 'Are you sure you want to accept this match?' + '\n' + matchSelected.matchtype + '\n' + 'Time: ' + matchSelected.datetime + '\n' + 'At: ' + matchSelected.courtname,
            cancel : 1,
            buttonNames : ['Yes', 'Cancel']
        });
alertWindow.addEventListener('click', function(ev) {
            Titanium.API.info("cancel " + ev.cancel);
            Titanium.API.info("index " + ev.index);
switch(e.source.action){
            //switch(ev.index) {
                //case 0:
                case 'swapImages':

                    break;
                case 'swapImages':

                    imageView.image = 'images/nomatch.png';
                    break;

            }
        });
        alertWindow.show();

    } else {

        imageView.image = 'images/nomatch.png';
        var alertWindow = Titanium.UI.createAlertDialog({
            title : 'Cancel This Match?',
            message : 'Are you sure you want to cancel this match?',// + '\n' + matchSelected.matchtype + '\n' + 'Time: ' + matchSelected.datetime + '\n' + 'At: ' + matchSelected.courtname,
            cancel : 1,
            buttonNames : ['Yes', 'Keep Match']
        });

        alertWindow.addEventListener('click', function(ev) {
            Titanium.API.info("cancel " + ev.cancel);
            Titanium.API.info("index " + ev.index);

            switch(e.source.action) {
                case 'swapImages':

                    break;
                case 'swapImages':

                    imageView.image = 'images/match.png';
                    break;

            }
        });
        alertWindow.show();
    }
});

        tableview.setData(tableData);

    },

如何编写代码以便它可以处理行中的每个对象?

2 个答案:

答案 0 :(得分:1)

除了Dawson Toth的回答,请尝试将bubbleParent属性重置为false。在您的情况下,事件可能会传播到父级。在这里,您已将eventlistener添加到tableViewRow。因此,每次点击孩子都会传播给父母。 bubbleParent的默认值为true。将bubbleParent设置为false不会传播操作。

    var acceptmatchView = Ti.UI.createView({
        left : '0pt',
        top : '0pt',
        width : '60pt',
        height : '60pt',
        bubbleParent: false
        });

    var acceptmatch = Ti.UI.createImageView({
        image : 'images/nomatch.png',
        left : '0pt',
        top : '0pt',
        width : '60pt',
        action: 'swapImages',
        height : '60pt',
        bubbleParent: false
        });

答案 1 :(得分:0)

一种方法是向对象添加action: 'swapImages'等属性,单击该对象时应交换图像。您可以添加其他内容,例如action: 'dial'。然后在您的点击监听器中:switch (e.source.action) { case 'swapImages': ... break; ... etc }。在许多应用程序中,这种模式对我来说效果很好。