Assertion failure in void _UIPerformResizeOfTextViewForTextContainer while passing data in Segue

时间:2018-04-20 01:15:00

标签: ios swift

func trimVideo (sourceURL: URL, destinationURL: URL, trimPoints: TrimPoints, completion: @escaping () -> Void) {

        guard sourceURL.isFileURL else { return }
        guard destinationURL.isFileURL else { return }

        let options = [
            AVURLAssetPreferPreciseDurationAndTimingKey: true
        ]

        let asset = AVURLAsset(url: sourceURL, options: options)
        let preferredPreset = AVAssetExportPresetPassthrough

        if  verifyPresetForAsset(preset: preferredPreset, asset: asset) {

            let composition = AVMutableComposition()
            let videoCompTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: CMPersistentTrackID())
            let audioCompTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: CMPersistentTrackID())

            guard let assetVideoTrack: AVAssetTrack = asset.tracks(withMediaType: .video).first else { return }
            guard let assetAudioTrack: AVAssetTrack = asset.tracks(withMediaType: .audio).first else { return }

            var accumulatedTime = kCMTimeZero
            for (startTimeForCurrentSlice, endTimeForCurrentSlice) in trimPoints {
                let durationOfCurrentSlice = CMTimeSubtract(endTimeForCurrentSlice, startTimeForCurrentSlice)
                let timeRangeForCurrentSlice = CMTimeRangeMake(startTimeForCurrentSlice, durationOfCurrentSlice)

                do {
                    try videoCompTrack!.insertTimeRange(timeRangeForCurrentSlice, of: assetVideoTrack, at: accumulatedTime)
                    try audioCompTrack!.insertTimeRange(timeRangeForCurrentSlice, of: assetAudioTrack, at: accumulatedTime)
                    accumulatedTime = CMTimeAdd(accumulatedTime, durationOfCurrentSlice)
                }
                catch let compError {
                    print("TrimVideo: error during composition: \(compError)")
                }
            }

            guard let exportSession = AVAssetExportSession(asset: composition, presetName: preferredPreset) else { return }

            exportSession.outputURL = destinationURL as URL
            exportSession.outputFileType = AVFileType.m4v
            exportSession.shouldOptimizeForNetworkUse = true

            removeFileAtURLIfExists(url: destinationURL as URL)

            exportSession.exportAsynchronously {
                completion()
            }
        }
        else {
            print("TrimVideo - Could not find a suitable export preset for the input video")
        }
    }     
@IBAction func nextButtonPressed(_ sender: Any) {

        if MyVariables.isScreenshot == true {
            //get image from current time
            print("screenshot")
            guard let currentTime = trimmerView.currentPlayerTime else {
                return
            }
            self.thumbnailImage = imageFromVideo(url: footageURL!, time: currentTime )
            self.screenshotOut = imageFromVideo(url: footageURL!, time: currentTime )
            self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
        } else {
            print("video")
            let outputFileName = NSUUID().uuidString
            let outputFilePath = (NSTemporaryDirectory() as NSString).appendingPathComponent((outputFileName as NSString).appendingPathExtension("mov")!)
            self.videoURL = URL(fileURLWithPath: outputFilePath)
            trimVideo(sourceURL: self.footageURL!, destinationURL: self.videoURL!, trimPoints: [(trimmerView.startTime!,trimmerView.endTime!)], completion: self.finishVideo)

        }
    }
    func finishVideo() -> Void {
            guard let VideoURL = self.videoURL else { return }
            self.thumbnailImage = setThumbnailFrom(path: VideoURL)
            print("got to segue") //This does print successfully so something is happening in the segue... 
            self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        if segue.identifier == "CreatePost_Segue" {
            let controller = segue.destination as! CreatePostViewController
            controller.thumbnailImage = self.thumbnailImage
            controller.videoURL = self.videoURL
            controller.screenshotOut = self.screenshotOut
        }
    }

So in nextButtonPressed you can see that I if the. media is a video (it is), I am using the trimVideo function and a custom completion handler of finishVideo to create a thumbnail with the trimmed video as well as perform the segue itself.

Everything executes without error until the segue so I believe I am sending the data wrong perhaps? Perhaps something to do with screenshotOut not being set if its a video?

The full error is

*** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIFoundation/UIFoundation-546.2/UIFoundation/TextSystem/NSLayoutManager_Private.m:1619

1 个答案:

答案 0 :(得分:0)

我用@ aBilal17给出的建议来解决这个问题,就像在主线程上运行segue一样:

func finishVideo() -> Void {
        guard let VideoURL = self.videoURL else { return }
        self.thumbnailImage = setThumbnailFrom(path: VideoURL)
        print("got to segue")
        DispatchQueue.main.async {
            self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
        }
    }