Представление сбора, получающее ноль при перезагрузке данных - PullRequest
0 голосов
/ 30 января 2019

У меня есть collectionView, где я показываю некоторые изображения, первоначально с помощью метода setup collectionview все работает нормально.

@IBOutlet weak var collectionView: UICollectionView!

func setupCollectionView(){
    DispatchQueue.main.async {
        self.collectionView.delegate = self
        self.collectionView.dataSource = self
    }
    self.collectionView.register(UINib(nibName: "WallPapersCell", bundle: nil), forCellWithReuseIdentifier: "WallPapersCell")
}

При возникновении изменений возникает проблемамассив Я перезагружаю данные, но collectionView получаю nil, следовательно, collectionView.reloadData() не вызывается.Что может быть причиной?Я что-то упустил?

private var imagePathArray = [String](){
    didSet {
        print("did set")

        if let collectionView = self.collectionView {
            collectionView.reloadData()
        }
    }
}
func loadVideoWithVideoURL(_ videoURL: URL) {
        print("load video url \(videoURL)")
       // displayImageView.livePhoto = nil
        let asset = AVURLAsset(url: videoURL)
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
        let time = NSValue(time: CMTimeMakeWithSeconds(CMTimeGetSeconds(asset.duration)/2, preferredTimescale: asset.duration.timescale))
        generator.generateCGImagesAsynchronously(forTimes: [time]) { [weak self] _, image, _, _, _ in
            if let image = image, let data = UIImage(cgImage: image).pngData() {
                let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
                let uniqueImageName = videoURL.deletingPathExtension().lastPathComponent
                print("/\(uniqueImageName).JPG")
                let imageURL = urls[0].appendingPathComponent("\(uniqueImageName).jpg")
                try? data.write(to: imageURL, options: [.atomic])
                print("Load image url \(imageURL)")
                let image = imageURL.path
                let mov = videoURL.path
                print("image path \(image) and mov path\(mov)")
                let output = FilePaths.VidToLive.livePath

                print(output)
                let assetIdentifier = UUID().uuidString
                print(output)
                if FileManager.default.fileExists(atPath: output + "/LiveWallpapers"){
                    print("exits")
                }else{
                    self?.createLiveWallpapersDirectoryIfNotExists(output: output)
                    print("live wallpapers folder doesnot exists in caches directory")
                }
                if FileManager.default.fileExists(atPath: output + "/LiveWallpapers/\(uniqueImageName).JPG"){
                    print("exits")
                    return
                }

                JPEG(path: image).write(output + "/LiveWallpapers/\(uniqueImageName).JPG",
                    assetIdentifier: assetIdentifier)
                QuickTimeMov(path: mov).write(output + "/LiveWallpapers/\(uniqueImageName).MOV",
                    assetIdentifier: assetIdentifier)
                self?.imagePathArray.append(output + "/LiveWallpapers/\(uniqueImageName).JPG")

                self?.videoPathArray.append(output + "/LiveWallpapers/\(uniqueImageName).MOV")

// here it is getting failed
                self?.exportLivePhoto(cachePath: "/LiveWallpapers/\(uniqueImageName)")

            }
        }
    }

Эта функция не работает, когда я пытаюсь записать видео и соединить видео и фото.The operation couldn’t be completed. (Cocoa error -1.) эту ошибку я получаю, следовательно, получаю ошибку.

 func exportLivePhoto (cachePath : String) {
        PHPhotoLibrary.shared().performChanges({ () -> Void in
            let creationRequest = PHAssetCreationRequest.forAsset()
            let options = PHAssetResourceCreationOptions()


            creationRequest.addResource(with: PHAssetResourceType.pairedVideo, fileURL: URL(fileURLWithPath: "\(cachePath).MOV"), options: options)
            creationRequest.addResource(with: PHAssetResourceType.photo, fileURL: URL(fileURLWithPath:"\(cachePath).JPG"), options: options)

        }, completionHandler: { (success, error) -> Void in
            if !success {
                NSLog("export live error" + (error?.localizedDescription)!)
            }
        })
    }

Есть предложения?

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вопрос теперь касается двух вопросов.Вы должны ограничить область вашего вопроса одной проблемой.

Для проблемы collectionView:

Похоже, что вы ссылаетесь на collectionView извне класса,Если он не инициализирован из кончика или раскадровки, он не будет создавать соединения IBOutlet / IBAction.

ОБНОВЛЕНИЕ:

Из комментариев мы определили, что VC используется как синглтон через статическое свойство и что это не будет загружать кончик и соединять выходы.Я бы посоветовал переместить общий код в другой класс / службу и использовать его там, где это необходимо.

Для проблемы exportLiveVideo:

Путь, который вы проходитеis:

/LiveWallpapers/\(uniqueImageName)

Вам необходимо пройти полный путь ..

Изменить

self?.exportLivePhoto(cachePath: "/LiveWallpapers/\(uniqueImageName)")

на

self?.exportLivePhoto(cachePath: output + "/LiveWallpapers/\(uniqueImageName)")
0 голосов
/ 30 января 2019
  • Убедитесь, что ваш IBOutlet collectionView подключен и setupCollectionView () вызывается до imagePathArray .
  • Также вы можете написать код, как показано ниже, в вашем viewDidLoad вместо реализации метода setupCollectionView ():

    override func viewDidLoad() {    
           super.viewDidLoad()       
           self.collectionView.delegate = self
           self.collectionView.datasource = self
           self.collectionView.register(UINib(nibName: "WallPapersCell", bundle: nil), forCellWithReuseIdentifier: "WallPapersCell")
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...