2016-09-18 2 views
2

Я работаю над пользовательским расширением приложения наклейки, и я хочу пропустить мою папку Sticker.xcassets вместо настройки фиксированного цикла.Как перебирать файлы на Stickers.xcassets или получать изображения с xcassets?

Например:

func getStickers() { 

    for index in 1...16 { 
     addSticker(location: "\(index)", description: "\(index)") 
    } 
} 

ответ

0

Вы, наверное, знаете, что у вас нет доступа к файлам в вашей папке проекта с использованием строковых литералов пути. Вместо этого вы используете функции, предоставляемые NSBundle. К счастью, они включают функции, которые будут делать то, что вы ищете. Глядя на ссылках для разработчиков NSBundle по адресу:

https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html

Листингового Я думаю, что вы хотите от этого документ 3-11, который описывает, как вывести все активы данного типа из пучка:

CFArrayRef birdURLs; 

// Find all of the JPEG images in a given directory. 
birdURLs = CFBundleCopyResourceURLsOfType(mainBundle, 
       CFSTR("jpg"), 
       CFSTR("BirdImages")); 

Надеюсь, что это поможет!

+0

Концептуально я понимаю, но как бы это сделать в Swift? Я пробовал адаптировать код для работы в рамках своего проекта, и он выплевывает массу забавных ошибок. –

0

Вы не можете программно получить файл .xcassets во время выполнения. Я также работаю над подобной задачей, решение, которое я придумал, очень простое. Изображения называются с использованием следующего соглашения: imageNameAndIdentifier (например: heart0, heart1, heart2 и т. Д.). Используя цикл, в котором построено полное имя изображения и создается UIImage, я получаю все необходимые изображения.

let stickerName = "heart" 
    var images = [UIImage]() 
    var lastImageIndex = 0 

    lastImageIndex = lastStickerImageIndex(name: stickerName) 

    for index in 0...lastImageIndex { 
     images.append(UIImage.init(named: stickerName + "\(index)")) 
    } 

Обратите внимание: lastImageIndex переменная. Это значение рассчитывается на основе количества файлов, которое содержит в имени файла заданную строку и вычитает одну единицу, поскольку последний индекс = (length_of_array - 1).

private func lastStickerImageIndex(name: String) -> Int { 
    return (FileManager.default.numberOfFilesWhichNameContains(string: name) - 1) 
} 

Я создал расширение, которое возвращает количество файлов на основе строки, которая должна содержаться в желаемом имени файла.

extension FileManager { 

    func numberOfFilesWhichNameContains(string: String) -> Int { 

     do { 
      let bundleFiles = try self.contentsOfDirectory(atPath: Bundle.main.bundlePath) 
      let filteredBundleFiles = bundleFiles.filter({ 
       $0.contains(string) 
      }) 

      return filteredBundleFiles.count 

     } catch let error { 
      print(error) 
     } 

     return 0 
    } 

} 
+0

Спасибо! Я дам вам понять, что произойдет. Cheers –

+0

Эй, попробуй свой код и получив «Использование неразрешенного идентификатора« имя ». Это что-то, что должно быть передано через функцию? –

+0

Это доступно в публичном репозитории или в форме? Спасибо! –

Смежные вопросы