Swift Segue не работает в didFinishPickingMediaWithInfo ImagePickerController's - PullRequest
0 голосов
/ 08 июня 2018

У меня есть этот код:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        //dismiss(animated: true, completion: nil)
        guard info[UIImagePickerControllerMediaType] != nil else { return }
        let mediaType = info[UIImagePickerControllerMediaType] as! CFString
        print("video is",mediaType)
        switch mediaType {
        case kUTTypeImage:
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage, let pickedAsset = info[UIImagePickerControllerPHAsset] as? PHAsset {
                self.screenshotOut = pickedImage
                MyVariables.isScreenshot = true
                self.thumbnailImage = pickedImage
                let creationDate = pickedAsset.creationDate
                self.mediaDate = creationDate
                dismiss(animated: true, completion: nil)
                self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
                }

            }
            break
....
    default:
        dismiss(animated: true, completion: nil)

        print("something else")
        break
    }
}

Как вы можете видеть, он ждет, пока у моего imagePickerController не появится фото актив.Затем он устанавливает некоторые переменные класса и выполняет переход.У меня есть эта функция, чтобы подготовиться к переходу

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    if segue.identifier == "CreatePost_Segue" {
        guard self.thumbnailImage != nil else {
            return
        }
        if MyVariables.isScreenshot == true {
            guard self.screenshotOut != nil else {
                return
            }
            //self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
        } else {
            guard self.thumbnailImage != nil else {
                return
            }
            //self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)
            //now I set those three varibles?
        }
        let controller = segue.destination as! CreatePostViewController
        controller.postDate = mediaDate
        controller.thumbnailImage = thumbnailImage
        controller.videoURL = videoURL
        controller.screenshotOut = screenshotOut
        print("segued",controller.postDate)
        print("segued",controller.thumbnailImage)
        print("segued",controller.videoURL)
        print("segued",controller.screenshotOut)
    }
}

, она печатает:

segued Optional(2016-05-04 17:48:53 +0000)
segued Optional(<UIImage: 0x13d365720> size {2448, 3264} orientation 0 scale 1.000000)
segued nil
segued Optional(<UIImage: 0x13d365720> size {2448, 3264} orientation 0 scale 1.000000)

, поэтому кажется, что все назначения контроллера сработали ... videoURL намеренно равен нулю иэто необязательно, поэтому я считаю, что все в порядке.

Но этого никогда не случится.Контроллер сборщика уволен, и это здорово, но почему бы это не сделать?

1 Ответ

0 голосов
/ 08 июня 2018

Поскольку dismiss анимирован, VC в настоящее время представляет библиотеку камеры / фотографии, поэтому он не может представить другую, вы можете отправить ее

dismiss(animated: true, completion: nil)

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)  {

  self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)

}

или для правильной задержки

self.dismiss(animated: true) {

   self.performSegue(withIdentifier: "CreatePost_Segue", sender: nil)

}

// вы можете найти сообщение, которое VC в данный момент представляет // в консоли

...