Не удается получить файлы, отличные от jpg/png, из каталога активов в Xcode 7

Я хочу получить файлы, отличные от jpg/png, из каталога активов в Xcode 7. Я увидел, что теперь можно добавлять любые данные в каталог активов.

Так что то, как я это делал, работало до перемещения gif / видео из проекта Xcode в каталог активов.

private struct WalkthroughVideo {
    static let name = "tokyo"
    static let type = "mp4"
  }

private var moviePlayer : AVPlayerViewController? = {
    guard let path = NSBundle.mainBundle().pathForResource(WalkthroughVideo.name, ofType: WalkthroughVideo.type) else {
      return nil
    }
    let url = NSURL.fileURLWithPath(path)
    let playerViewController = AVPlayerViewController()
    playerViewController.player = AVPlayer(URL: url)
    return playerViewController
   }()

Итак, теперь путь равен нулю. Он не может найти файл. Есть ли новый способ получить набор данных?


person Aymenworks    schedule 14.06.2015    source источник
comment
Не могли бы вы распечатать путь, пожалуйста?   -  person LinusGeffarth    schedule 14.06.2015
comment
теперь путь равен нулю. Он не может найти файл   -  person Aymenworks    schedule 14.06.2015
comment
Вы очистили и построили проект?   -  person LinusGeffarth    schedule 14.06.2015
comment
Да, также удалены производные данные.   -  person Aymenworks    schedule 14.06.2015
comment
Доступен ли каталог активов для вашей цели?   -  person LinusGeffarth    schedule 14.06.2015
comment
Я думаю, тоже. Я думал, что это не только для ресурсов по требованию ^^.   -  person Aymenworks    schedule 14.06.2015


Ответы (1)


Очевидно, что pathForResource не сработает, потому что ресурса больше нет в вашем комплекте приложений — он находится в вашем каталоге ресурсов. По сути, у него больше нет «пути».

Вы должны использовать новый класс NSDataAsset, который может извлекать произвольные данные по имени из каталога ресурсов. Чтобы имитировать ваш пример tokyo.mp4, я использовал звуковой файл AIFF, хранящийся в моем каталоге ресурсов в виде набора данных под названием theme (в универсальном слоте). Вот мой полный тестовый код (в моем корневом контроллере):

var player : AVAudioPlayer!
override func viewDidLoad() {
    super.viewDidLoad()
    if let asset = NSDataAsset(name: "theme") {
        let data = asset.data
        self.player = try! AVAudioPlayer(data:data)
        self.player.play()
    }
}

О чудо, звук заиграл! Конечно, в реальной жизни я бы добавил обработку ошибок в этот try.

person matt    schedule 14.06.2015
comment
Я тоже думаю, что неправильно понял эту функцию. Я думал, что это не только для ресурсов по требованию ^^. Но с ресурсами по требованию он загружает ресурсы, хранящиеся непосредственно в App Store, поэтому при разработке мы не можем использовать эту функцию, не так ли? - person Aymenworks; 14.06.2015
comment
Я смотрел, что нового в Xcode 7 (когда он говорит о ресурсах по требованию, тегах). Я только что видел, что было видео о ресурсах по запросу. Я проверю его. - person Aymenworks; 14.06.2015
comment
Хорошо, я был совершенно не прав насчет этого. Отметьте меня. Но я исправил свой ответ! Отметьте меня снова. Прошу прощения, но мы все вместе учимся... - person matt; 17.06.2015
comment
Красиво, ну и где ты его нашел? И знаете ли вы, можно ли это сделать прямо из раскадровки (например, для UIImage) - person Aymenworks; 17.06.2015
comment
NSDataAsset доступен только в iOS 9. Можно ли получить доступ к файлам активов данных в iOS 8? - person Franklin Yu; 13.04.2016