Titanium:不能将相机与 OptionDialog 一起使用

Posted

技术标签:

【中文标题】Titanium:不能将相机与 OptionDialog 一起使用【英文标题】:Titanium: Cannot use Camera together with OptionDialog 【发布时间】:2014-03-22 12:49:25 【问题描述】:

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

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

    打开选项对话框并选择打开相机的“拍照” 点击取消 再次打开选项对话框并再次选择“拍照” 再次点击取消 - 应用崩溃

我在控制台中收到以下消息:

当视图控制器不是顶部呈现的视图时关闭它 控制器。现在可能会崩溃。

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

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

MPUSystemMediaControls] 更新当前播放的支持命令 应用。

看起来这个问题已经在 this *** 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】:

我找到了解决办法。

诀窍是每次需要打开相机时都创建一个新的 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();
);

【讨论】:

for $.myWin.remove(dialog);行我得到一个错误:传递给函数的类型无效。如果我删除那条线,一切都会完美。

以上是关于Titanium:不能将相机与 OptionDialog 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Titanium - 如何将视图发送到另一个页面?

Titanium 和 Testflight 不能一起工作

ImageView 使用存储在 Titanium.Filesystem.applicationDataDirectory 的图像显示占位符,而不是图像

如何使用 Titanium 中集成的 StartApp SDK?

UIImagePickerController:忽略拍照请求;相机正在改变模式

Titanium共享Intent与页面链接