Titanium - 视图上的Click事件将被忽略

时间:2012-09-13 18:23:20

标签: ios events titanium appcelerator

我正在开发Titanium并开发iOS设备。在我的应用程序中,我有一个tableview,其中包含由使用从HTTPClient对象响应接收的数据的函数创建的行的部分。每行都有一个视图,在视图内部有一个按钮和标签。

该按钮有一个click事件可以正常工作。我在存储按钮的视图中添加了一个click事件,但是当我单击视图时,事件不会被触发,但是如果我单击该按钮,则会触发按钮的事件和视图的事件。这不是它应该如何表现,因为我希望视图的事件与按钮的事件完全不同。

为什么单击视图时视图的点击事件不会被触发?为什么单击按钮时事件会触发?

以下是我创建行的方法:

function addToDo(title, priority){

    var that = {};      
    var row = Ti.UI.createTableViewRow({height:80});        
    that.currentPriority = priority;        
    that.resolveColor = function(tmpPriority){          
        switch(tmpPriority){                
            case 0: backgroundColorPriority = "#da362a"; break;
            case 1: backgroundColorPriority = "#da6c2a"; break;
            case 2: backgroundColorPriority = "#da962a"; break;
            case 3: backgroundColorPriority = "#dacb2a"; break;                         
        }               
        return backgroundColorPriority;
    }

    var rowLayout = Ti.UI.createView({
        backgroundColor : 'transparent'
    });

    var checkbox = Ti.UI.createButton({
        top: 25,
        left: 5,
        width: 30,
        height: 30,
        borderColor: 'white',
        borderWidth: 2,
        borderRadius: 1,
        backgroundColor: '#b1b1b1',
        backgroundImage: 'NONE',
        zIndex:10,
        value: false //value is a custom property in this case here.
    });
    rowLayout.add(checkbox);

    //Attach some simple on/off actions
    checkbox.on = function(item) {
        this.backgroundColor = '#62b425';

        item.currentRow.backgroundColor = "#101010";
        this.value = true;
    };

    checkbox.off = function(item) {
        this.backgroundColor = '#b1b1b1';
        item.currentRow.backgroundColor = item.resolveColor(item.currentPriority);
        this.value = false;
    };

    checkbox.addEventListener('click', function(e) {
        if(false == e.source.value) {
            e.source.on(that);
        } else {
            e.source.off(that); 
        }
    });

    // Create a Label.
    var todoTitleLabel = Ti.UI.createLabel({
        text : title,
        color : 'white',
        font : {fontSize:11},
        left : 40,
        textAlign : 'center'
    });

    // Add to the parent view.
    rowLayout.add(todoTitleLabel);

    row.add(rowLayout);

    rowLayout.addEventListener('click', function(e){
        // Whatever I put here isn't executed when I click on the rowLayout, instead I have to click the button to fire this event, that shouldn't happen
    });

    var backgroundColorPriority = that.resolveColor(that.currentPriority);      
    row.backgroundColor = backgroundColorPriority
    that.currentRow = row;
    return that.currentRow;

}

在HTTPClient onload中调用此函数:

var clientTask = Ti.Network.createHTTPClient({
    onload : function(e){
        var responseTask = JSON.parse(this.responseText);
        var entriesTask = responseTask.tasks;
        var todoSectionView = Ti.UI.createTableViewSection({
            headerTitle : responseTask.name
        });
        data.push(todoSectionView);
        for( var j=0; j < entriesTask.length; j++){
           var tmpRow = addToDo(entriesTask[j].name, entriesTask[j].priority);
           todoSectionView.add(tmpRow);
        }
        // add the data to the tableview
        table.data=data;
        self.updateLayout();
    },
    timeout : 60000
});

2 个答案:

答案 0 :(得分:0)

我可能会通过为todoTitleLabel创建一个事件处理程序或给它一个与行不同的背景颜色来测试它,看看我是否能够单击该行本身。也许它上面的物体阻挡了它?也许你可以通过将click事件添加到标签来完成你想要做的事情吗?

答案 1 :(得分:0)

不要将eventlistener添加到row,section或rowlayout。它会在iOS上造成问题。

相反,将eventlistener添加到表视图中,例如:

tableView.addEventListener('click', function(e){
   var rowNumber = e.index;
   alert(rowNumber);
});

该示例将提醒所选行的编号。