0

На iOS нажмите на кнопку TableViewRow, чтобы активировать событие на TableViewRow вместо своего дочернего элемента. Как это исправить?Ребенок TableViewRow запускает событие на TableViewRow вместо его дочернего iOS (Appcelerator Titanium)

У меня есть Tableview, который имеет нажмите событие, прикрепленную к нему и заполняется строками:

var tableView = Ti.UI.createTableView({ 
    populateData: populateData 
}); 

tableView.addEventListener('click', tableViewClick); 

Ряды просты и добавлены имеют вид:

var row = Ti.UI.createTableViewRow({ 
    type: 'row', 
    height: 70, 
    className: 'notes', 
}); 

     var container = Ti.UI.createView({ 
      left: 15, 
      width: Ti.UI.SIZE, 
      touchEnabled: false, 
     }); 

      var image = Ti.UI.createImageView({ 
       image: '/images/usuwanie.png', 
       width: 35, 
       height: 35, 
       type: 'delete', 
       id: data.id, 
       searchType: data.type 
      }); 

     container.add(image); 

row.add(container); 

Нажмите действие распознать, какой объект уволен событие:

var tableViewClick = function(e) { 

    var type = e.source.type; 
    var id = e.source.id; 
    var searchType = e.source.searchType; 
    var additionalText = e.source.additionalText; 
    alert(e.source.type); 
    switch(type) { 
     case 'delete': 
      deleteShopping(id,searchType); 
      break; 
     case 'edit': 
      editShopping(id, searchType, additionalText); 
      break; 
    } 

}; 

Он отлично работает на Android - если я нажму на изображение, imageView является источником события (срабатывает предупреждение «delete» и «deleteShopping»).

В iOS источником всегда является строка (вместо ImageView), а предупреждение возвращает «строка», и никакая функция не вызывается.

ответ

0

Причина, заключавшаяся в том, что родительский контейнер имел свойство «touchEnabled» равное false. Если это так, то дети не будут возбуждать события. На Android это сработает. На iOS этого не произойдет. Так что только нужно, чтобы изменить код так:

var row = Ti.UI.createTableViewRow({ 
    type: 'row', 
    height: 70, 
    className: 'notes', 
}); 

    var container = Ti.UI.createView({ 
     left: 15, 
     width: Ti.UI.SIZE, 
     //touchEnabled: false, 
     //touchEnabled above has to be commented 
    }); 

     var image = Ti.UI.createImageView({ 
      image: '/images/usuwanie.png', 
      width: 35, 
      height: 35, 
      type: 'delete', 
      id: data.id, 
      searchType: data.type 
     }); 

    container.add(image); 

row.add(container); 
1

Ошибка на самом деле в Android. iOS ведет себя так, как ожидалось. Поскольку на изображении нет прослушивателя событий, он не должен быть источником. Событие разбухает до TableView, так как в этом случае слушатель подключен.

Чтобы исправить это, вам нужно добавить eventListener на изображение каждой строки.

+0

Я не ожидал, что из-за, но если мы считаем, что слушатель должен быть присоединен к источнику постоянного, чем мы не должны добавить слушателя Tableview, если мы хотим иметь tableViewRow как источник. Этот подход поддерживается документацией как лучше и менее требовательной (один слушатель вместо одного для каждой строки). Я думал об изменении кода, как вы говорите, но у меня есть 2 изображения в строке, которые пользователь может щелкнуть. Если у меня есть 80 строк, то у меня есть 160 (sic!) Слушателей. Это не выглядит хорошо ... – kreatywny

+0

К сожалению, ваш ответ неправильный или я пропустил вас. Если я добавлю eventListener к изображениям, то он будет переопределен слушателем, добавленным в строку. – kreatywny

+0

ТаблицаView является исключением для большинства eventListeners в Titanium. Обычно вам нужно будет добавить слушателя непосредственно к объекту. –