首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.iOS -尝试使用LoadDataRepresentation从NSItemProvider获取NSData时出现问题

Xamarin.iOS -尝试使用LoadDataRepresentation从NSItemProvider获取NSData时出现问题
EN

Stack Overflow用户
提问于 2018-10-31 03:42:07
回答 1查看 377关注 0票数 1

我正在尝试开发一个共享扩展,以获取文件(图像,pdf,办公室,文本等),并通过Rest API将其发送到云,但无法将NSItemProvider中的数据转换为NSData。同时,我在使用VS2017调试共享扩展项目时遇到了问题,所以我使用标志和警报代替了老式的做法。我的ViewController代码是这样的

代码语言:javascript
复制
using CoreFoundation;
using Foundation;
using Social;
using System;
using UIKit;

namespace Share
{
    public partial class ShareExtensionViewController : SLComposeServiceViewController
    {
        public string message = string.Empty;

        public ShareExtensionViewController(IntPtr handle) : base(handle)
        {
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
        }

        public override bool IsContentValid()
        {
            return true;
        }

        public override void DidSelectPost()
        {
            NSItemProvider itemProvider = new NSItemProvider();
            try
            {
                NSExtensionItem item = ExtensionContext.InputItems[0];

                if (item != null)
                {
                    message = "NSExtensionItem 1\n";

                    itemProvider = item.Attachments[0];
                    if (itemProvider?.HasItemConformingTo(itemProvider.RegisteredTypeIdentifiers[0]) == true)
                    {
                        message += "NSItemProvider 2\n";

                        itemProvider.LoadDataRepresentation(itemProvider.RegisteredTypeIdentifiers[0], (dataRaw, error) =>
                        {
                            var data = dataRaw;
                            DispatchQueue.MainQueue.DispatchSync(() =>
                            {
                                message += "NSData 3\n" + error;

                                if (data != null)
                                {
                                    message += "dataBytes 4\n";
                                    //byte[] dataBytes = data.ToArray();
                                }
                            });
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                message += "\n" + ex.Message + "\n" + ex.StackTrace;
            }

            message += "\n" + ExtensionContext.InputItems[0].AttributedContentText;

            UIAlertController alert = UIAlertController.Create(itemProvider.RegisteredTypeIdentifiers[0], message, UIAlertControllerStyle.Alert);

            PresentViewController(alert, true, () =>
            {
                DispatchQueue.MainQueue.DispatchAfter(new DispatchTime(DispatchTime.Now, 5000000000), () =>
                {
                    ExtensionContext.CompleteRequest(null, null);
                });
            });
        }

        public override SLComposeSheetConfigurationItem[] GetConfigurationItems()
        {
            return new SLComposeSheetConfigurationItem[0];
        }
    }
}

执行只是简单地传递LoadDataRepresentation方法。我尝试了LoadItem,也得到了同样的结果。

求求你,我需要一些帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-10-31 07:43:40

您是否尝试过使用LoadDataRepresentation method(s) of NSItemProvider?

有三个重载:

代码语言:javascript
复制
LoadDataRepresentation(String, Action<NSData, NSError>) : NSProgress
LoadDataRepresentationAsync(String) : System.Threading.Tasks.Task<NSData>
LoadDataRepresentationAsync(String, out NSProgress) : System.Threading.Tasks.Task<NSData>

第二个似乎是最简单的,只需用await调用它,您应该会得到一个NSData对象。

编辑:哦,我看到你在使用上面的第一个重载。是否确定dataRaw是有效的NSData对象?您似乎没有检查error是否为null,会不会有遗漏的错误?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53071766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档