如何在通过共享扩展选择的 NSUserDefaults 中存储多个图像

Posted

技术标签:

【中文标题】如何在通过共享扩展选择的 NSUserDefaults 中存储多个图像【英文标题】:How to store multiple images in NSUserDefaults picked through share extension 【发布时间】:2017-01-31 07:45:02 【问题描述】:

我目前为单张图片做的,效果很好。但我想选择多个图像并在应用程序中显示。任何人都可以帮助我。谢谢。

override func didSelectPost() 

        if let content = extensionContext!.inputItems[0] as? NSExtensionItem 
            let contentType = kUTTypeImage as String

            if let contents = content.attachments as? [NSItemProvider] 
                for attachment in contents 
                    if attachment.hasItemConformingToTypeIdentifier(contentType) 
                        attachment.loadItemForTypeIdentifier(contentType, options: nil)  data, error in
                            let url = data as! NSURL
                                if let imageData = NSData(contentsOfURL: url) 

                                    self.saveImage(imageData)

                            
                        
                    
                
            
        

        // Unblock the UI.
        self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
    

将图像保存为用户默认值

 func saveImage(imageData: NSData) 
            if let prefs = NSUserDefaults(suiteName: suiteName) 
                prefs.setObject(imageData, forKey: keyName)
            
    

在应用中阅读

if let prefs = NSUserDefaults(suiteName: suiteName) 

            if let imageData = prefs.objectForKey(keyName) as? NSData 

                drawCard(imageData)
            
        

我为数组修改了这个,但它不起作用。

override func didSelectPost() 

        if let content = extensionContext!.inputItems[0] as? NSExtensionItem 
            let contentType = kUTTypeImage as String

            if let contents = content.attachments as? [NSItemProvider] 
                for attachment in contents 
                    if attachment.hasItemConformingToTypeIdentifier(contentType) 
                        attachment.loadItemForTypeIdentifier(contentType, options: nil)  data, error in
                            let url = data as! NSURL
                                if let imageData = NSData(contentsOfURL: url) 

                                    galleryBucket[url] = imageData
                                    self.saveImage(galleryBucket)

                            
                        
                    
                
            
        

        // Unblock the UI.
        self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
    

将图像保存为用户默认值。

func saveImage(galleryBucket: [NSURL:NSData]) 
    if let prefs = NSUserDefaults(suiteName: suiteName) 
        prefs.setObject(galleryBucket, forKey: keyName)
    

galleryBucket 的结果是 nil

if let prefs = NSUserDefaults(suiteName: suiteName) 

            if let galleryBucket = prefs.objectForKey(keyName) as? [NSURL:NSData] 

                for imageData in galleryBucket

                    drawCard(imageData.1)
                
            
        

【问题讨论】:

为什么不只保存一个 NSData 数组来存储图像数组? @BenjaminLowry 请检查已编辑的问题,我做错了什么吗? 我不知道你在用drawCard(imageData.1) 做什么,因为我不相信 imageData 是一个元组,但除此之外它看起来还不错。我能想到的唯一会导致它为零的是如果您的 suiteNamekeyName 变量发生了变化。 drawCard(imageData.1) 会动态创建imageview,suiteName和keyName完全一样。 【参考方案1】:

UserDefaults 似乎不是保存图像的最佳位置..

看看这个: Save An Image To Application Documents Folder From UIView On ios

这就是您可以搜索特定文件扩展名的方式。 Getting list of files in documents folder

一旦你有了名字,这就是你检索它的方式。 Get image from documents directory swift

【讨论】:

以上是关于如何在通过共享扩展选择的 NSUserDefaults 中存储多个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何通过excludedActivityTypes 禁用扩展共享?

我可以通过应用扩展在主 iOS 应用中执行任务吗?

如何在 iOS 共享扩展中获取屏幕截图?

如何创建和使用 iOS 框架与扩展共享代码

chrome 扩展通过共享本地存储将多条消息传递到外部站点

如何在应用程序和它的扩展之间共享一个类?