Titanium:不能与OptionDialog一起使用Camera

时间:2014-03-22 12:49:26

标签: ios titanium appcelerator titanium-alloy

我在Titanium中创建了一个简单的交互,用户打开一个选项对话框,然后选择"拍照",打开相机。

这里的问题是,如果您执行以下操作,应用程序会崩溃:

  1. 打开选项对话框并选择"拍照"打开相机
  2. 点击取消
  3. 再次打开选项对话框并选择"拍照"再次
  4. 再次点击取消 - 应用崩溃
  5. 我在控制台中收到以下消息:

      

    当视图控制器不是顶部呈现视图时,将其解除   控制器。现在可能会崩溃。

         

    尝试关闭其视图没有的模态视图控制器   目前出现。 self = modalViewController =

         

    CoreAnimation:警告,删除线程与未提交的CATransaction;   在环境中设置CA_DEBUG_TRANSACTIONS = 1以记录回溯。

         

    MPUSystemMediaControls]更新现在正在播放的支持命令   应用

    看来这个问题已在this Stackoverflow Question中的Objective C中的本机iOS开发中修复,但我如何使用Titanium修复此问题?

    这是我的代码

    $.imageView.addEventListener("click", function (e) {
    
        $.imageDialog.cancel = 1;
        $.imageDialog.show();
    
        $.imageDialog.addEventListener("click", function (event) {
            if (event.index === 0) {
                $.imageDialog.hide();
                Titanium.Media.showCamera({
                    success: function (e) {
                        if (e.mediaType === Ti.Media.MEDIA_TYPE_PHOTO) {
                            $.beerImage.image = e.media;  
                            theImage = e.media;  
                            $.cameraImage.opacity = 0.5;
                        }
                    },
                    cancel: function (e) { console.log('Action was cancelled'); },
                    error: function (e)  { console.log('An error happened'); },
                    allowEditing: true,
                    mediaTypes: [Titanium.Media.MEDIA_TYPE_PHOTO],
                    videoQuality: Titanium.Media.QUALITY_HIGH
                });
            }             
        });
    });
    

    如果我不使用选项对话框并直接进入相机,我完全没有问题。如果没有此问题,是否无法同时使用选项对话框和相机?或者在我的代码中犯了错误?

1 个答案:

答案 0 :(得分:0)

我为此找到了解决方法。

诀窍是每次需要打开相机时创建一个新的OptionDialog。在下面的代码中,单击按钮打开相机时会创建选项对话框。因此,会创建一个新的OptionDialog,将事件列表添加到它,然后打开它。

$.imageView.addEventListener("click", function (e) { 

    var opts = {
      cancel: 2,
      options: ['Take Photo', 'Choose from gallery', 'Cancel'],
      destructive: 0,
      title: 'Choose'
    };

    var dialog = Ti.UI.createOptionDialog(opts);

    dialog.addEventListener("click", function (event) {
        if (event.index === 0) {
            Titanium.Media.showCamera({
                success: function () { ... },
                cancel: function () { ... },
                error: function () { ... },
                allowEditing: true,
                mediaTypes: [Titanium.Media.MEDIA_TYPE_PHOTO],
                videoQuality: Titanium.Media.QUALITY_HIGH
            });  
        }  
        $.addBeerWin.remove(dialog);          
    });

    dialog.show();
});