MessageAppExtension:如何将贴纸图像从资产加载到 MSStickerBrowserView?

sky*_*guy 4 message ios swift swift3 ios10

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

https://code.tutsplus.com/tutorials/create-an-imessage-app-in-ios-10--cms-26870

我已经完全复制了所有内容,并尝试创建一个基本的 MSStickerBrowserView 显示(然后使用逻辑过滤,但尚未尝试)我在我的资产文件夹中的贴纸 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)
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我收到错误

Bundle 没有成员 URLforResource

我找不到任何关于此的信息。如何在应用程序中以编程方式显示我的贴纸?

错误:

在此处输入图片说明

这些是我尝试加载的图像,无论其名称如何:

在此处输入图片说明

BJH*_*ios 5

本教程不使用资产目录的原因是,在调用包上的 urlForResource 方法时,您无法获得放置在 .xcassets 文件夹中的图像的有效文件 URL。

您需要像添加其他文件一样单独添加您的资产。此时在包上调用 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
}
Run Code Online (Sandbox Code Playgroud)

这应该让您只需调用它并获得您所追求的:

let stickers = createStickers(from: "YourFolderName")
Run Code Online (Sandbox Code Playgroud)

请注意不要在文件夹名称的开头包含正斜杠 ('/')。