0

iOSの場合、TableViewRowの子をクリックすると、子ではなくTableViewRowでイベントが発生します。それを修正するには?TableViewRowの子が子iOS(Appcelerator Titanium)の代わりにTableViewRowでイベントを発生しています

私はイベントそれに接続されていると行で満たされているをクリックしているの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をクリックすると、 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

私はので、しかし、場合、我々はtableViewRowを持つようにしたい場合は、我々はテーブルビューにリスナーを追加しないでくださいよりも、リスナーが直接電源に接続しなければならないと考えていることを期待していませんソースとして。このアプローチは、より良い要求と少ない要求(すべての行に対して1つのリスナではなく1つのリスナ)として文書化されています。 あなたが言うようにコードを変更することを考えましたが、ユーザーがクリックできる行に2つのイメージがあります。私は80以上の行を持っている場合、私は160人のリスナーを持っています。それは良く見えない... – kreatywny

+0

あなたの答えは間違っているか、私はあなたを忘れてしまった。 imageにeventListenerを追加すると、それはまだrowに追加されたリスナーによってオーバーライドされます。 – kreatywny

+0

tableViewは、TitaniumのほとんどのeventListenersの例外です。通常、オブジェクトに直接リスナーを追加する必要があります。 –

関連する問題