2012-04-30 5 views
1

私は、ユーザーがiOSフォトギャラリーから画像を選択する非常にシンプルなアプリケーションを持っています。アプリケーションレベルのイベントを通過するTIBlobが受信側でNULLになる

Titanium.Media.openPhotoGallery.successイベントに渡されたTIBlobは、アプリケーションレベルのイベントに渡されます。

アプリケーションレベルのイベントを受信すると、TIBlobがNULLになるという問題があります。

以下は完全なコードサンプルです。

Titanium.UI.setBackgroundColor('#000'); 

var win = Ti.UI.createWindow({title: 'Camera Test', exitOnClose: true, fullscreen: true, backgroundColor: '#ffffff'}); 

var bt = Ti.UI.createButton({'title': 'Gallery', top: 10, width: 200, height: 50}); 
bt.addEventListener('click', function(e) { 
    Titanium.Media.openPhotoGallery({ 
      success:function(event) { 
       if(event.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) { 
        alert(event.media); 
        Ti.App.fireEvent('uploadImage', {image: event.media, source: 'gallery'}); 
       }else { 
        alert('Image was not uploaded because the type was invalid.'); 
       } 
      }, 
      cancel:function() { 
      }, 
      error:function(err) { 
       alert('Error selecting image from gallery: ' + err); 
       Ti.API.error(err); 
      }, 
      allowEditing: false, 
      autohide: true, 
      mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO] 
     }); 
}); 

Ti.App.addEventListener('uploadImage', function(e) { 
    alert(e.image); 
    alert(e.source); 
}); 

win.add(bt); 
win.open(); 

いずれかの提案がありますか?

答えて

3

Appcelerator Guidesは、渡されたオブジェクトとイベントは、JSON-serializable https://wiki.appcelerator.org/display/guides/Event+Handling#EventHandling-Firingeventsである必要があります。 TiBlobはシリアライズ可能ではありません。そのため、ブログではイベントが発生していないと思います。

これは本当にシンプルなアプリケーションであれば、イベントを発生させる代わりに関数呼び出しに変更することをお勧めします。ブロブは保存されます。しかし、これが絶対にイベントでなければならない場合は、代わりにevent.media.nativePathを渡してから、実際に何かを行う必要があるときにそれを読んでください。

+0

イベントオブジェクトがJSONシリアライザブルである必要があることを知っておくと優れています。ありがとう! –

+0

別の注意として、event.media.nativePathは "nil文字列パラメータ"例外をスローします。それは何についての任意のアイデアですか? –

+0

.NativePathは、TiBlobがTi.Filesystem.Fileの場合にのみ使用可能ですので、イベント渡しメソッドは機能しません。私はちょうど別の周りにブロブを渡す必要があります。 –

関連する問題