Ios MessageAppExtension:如何将标签图像从资产加载到MSSTICKRBrowserview?

Ios MessageAppExtension:如何将标签图像从资产加载到MSSTICKRBrowserview?,ios,swift,message,swift3,ios10,Ios,Swift,Message,Swift3,Ios10,好的,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我遵循这一点来制作一个定制贴纸消息应用程序扩展: 我准确地复制了所有内容,并尝试创建一个基本的MSSTICKRBROWSVIEW显示(随后使用逻辑过滤,但尚未尝试)标签PNG,我的资产文件夹中有: 本教程似乎不是从资源加载的,而是从它们的项目加载的,不管它们的代码是否旧,如下所示: var stickers = [MSSticker]() func loadStickers() { for i in 1

好的,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我遵循这一点来制作一个定制贴纸消息应用程序扩展:

我准确地复制了所有内容,并尝试创建一个基本的MSSTICKRBROWSVIEW显示(随后使用逻辑过滤,但尚未尝试)标签PNG,我的资产文件夹中有:

本教程似乎不是从资源加载的,而是从它们的项目加载的,不管它们的代码是否旧,如下所示:

var stickers = [MSSticker]()

    func loadStickers() {
        for i in 1...2 {
            if let url = Bundle.main.urlForResource("Sticker \(i)",  withExtension: "png") { //ERROR!!
                do {
                    let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "")
                    stickers.append(sticker)
                } catch {
                    print(error)
                }
            }
        }
    }
我得到了错误

捆绑包没有成员URLforResource

我在这上面找不到任何东西。如何在应用程序中以编程方式显示标签

错误:

以下是我尝试加载的图像,无论它们的名称如何:


教程不使用资产目录的原因是,在对捆绑包调用urlForResource方法时,无法为放置在.xAssets文件夹中的图像获取有效的fileURL

你需要单独添加你的资产,就像将其他文件带入应用程序一样。在该点调用捆绑包上的pathForResource或urlForResource将不再返回nil

编辑:这里有一个函数,它将获取文件夹名称,循环遍历其内容并返回[MSSticker]?根据它的发现

func createStickers(from folderName: String) -> [MSSticker]? {

    guard
        let path = Bundle.main.resourcePath
        else { return nil }

    var stickers = [MSSticker]()
    let folderPath = "\(path)/\(folderName)"
    let folderURL = URL(fileURLWithPath: folderPath)

    //get a list of urls in the chosen directory
    do {
        let imageURLs = try FileManager.default.contentsOfDirectory(at: folderURL,
                                                                    includingPropertiesForKeys: nil,
                                                                    options: .skipsHiddenFiles)
        //loop through the found urls
        for url in imageURLs {
            //create the sticker and add it, or handle error
            do {
                let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "yourDescription")
                stickers.append(sticker)
            } catch let error {
                print(error.localizedDescription)
            }
        }

    } catch let error {
        print(error.localizedDescription)
    }

    //return nil if stickers array is empty
    return stickers.isEmpty ? nil : stickers
}
这应该让你只需要打电话,就可以得到你想要的:

let stickers = createStickers(from: "YourFolderName")
请注意不要在文件夹名称的开头包含正斜杠(“/”)。

只需将“resourceUrl”替换为:


代码在Swift 3中被替换。

您可以将图像放入这样的文件夹(XCODE视口):

它使事情更有条理,但不需要像放在.xAsset中那样多的代码

可以通过创建新组而不是创建.xAsset来完成(右键单击消息扩展并单击新建组):

贴纸BrowserView的以下代码可以这样调用:

导入UIKit
导入消息
类别浏览器服务控制器:MSSTICKRBROWSERVIEWCONTROLLER{
var标签=[MSSticker]()
func changeBrowserViewBackgroundColor(颜色:UIColor){
贴纸browserview.backgroundColor=颜色
}
func装载标签(){
createSticker(资产:“1”,本地化描述:“笑脸”)
创建标签(资产:“2”,本地化描述:“鬼脸”)
createSticker(资产:“3”,本地化描述:“笑眯眯的脸”)
createSticker(资产:“4”,本地化描述:“脸上充满喜悦的泪水”)
createSticker(资产:“5”,本地化描述:“张开嘴的笑脸”)
createSticker(资产:“6”,本地化描述:“张开嘴微笑的脸和微笑的眼睛”)
}
func CreateStacker(资产:字符串,本地化描述:字符串){
guard-let-patch=Bundle.main.path(forResource:asset,of type:“png”)else{
打印(“无法为”资产“创建标签路径)
返回
}
//我们使用URL,所以可以使用来自网络的图像
让TackerURL=URL(fileURLWithPath:TackerPath)
让贴纸:MSSticker
做{
try sticker=MSSticker(内容文件URL:stickerURL,localizedDescription:localizedDescription)
//本地化可访问性说明
贴纸。附加(贴纸)
}抓住{
打印(错误)
返回
}
}
覆盖func NumberOfStickets(在SticketBrowserView:MSStickerBrowserView中)->Int{
退回贴纸。计数
}
覆盖功能标签浏览视图(uStickerBrowserView:MSStickerBrowserView,标签索引:Int)->MSSticker{
返回标签[索引]作为MSSticker
}
}

(顺便说一句,不是我的博客,但在谷歌上找到了它,它非常有用)

好的,但看看我的错误问题-我如何用它加载我的资产文件夹的内容?对不起,在Swift 3中它应该是Bundle.main.url(forResource:String?,withExtension:String?)对不起,我提供了错误的声明。现在检查它。好的,这是有效的,但是我如何将所有PNG加载到我的标签包文件夹中的资产中?我在上面包括了一张图片是的,我知道了,但是我想把一个文件夹放满特定的图片,并对它们进行迭代(不仅仅是单个图片)。到目前为止,我无法导入文件夹,因为文件夹没有任何扩展名,所以您无法使用urlForResource-我如何才能做到这一点?@skyguy-我添加了一个函数,可以完成您需要的功能。我在一个示例项目中对它进行了测试,能够遍历文件夹并创建仅添加到扩展中的图像的标签。我将其放在扩展文件夹中,一切都正常运行它是一个.xcassets文件夹吗?只是再次运行了我的…工作正常,但当尝试访问一个不存在的文件夹或是一个资产文件夹时,我会收到相同的错误消息。我建议您查看模拟器目录并按照路径验证它是否确实存在
let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png")