Есть ли способ управления тем, к какому контроллеру представления подключаться после завершения выбора изображения? - PullRequest
0 голосов
/ 01 апреля 2019

В приложении, над которым я работаю, у меня есть средство выбора изображений, которое вызывается нажатием кнопки на контроллере представления 1. После выбора изображения я хочу отправить его на просмотр контроллера 2, чтобы пользователь мог вводить метаданные о изображение перед загрузкой.

В приведенном ниже коде у меня это работает нормально, но есть одна вещь, которую я не могу понять. Когда я просматриваю просмотр контроллера 2, первый контроллер просмотра всегда мигает на экране, а не сразу переходит к просмотру контроллера 2. Последовательность событий выглядит так, как будто выбрано средство выбора изображений -> кратко отображается контроллер представления 1 -> подготовиться к переходу к процессам -> затем просмотреть загрузки контроллера 2.

Есть ли способ, которым я могу изменить свой код, чтобы переход к просмотру контроллера 2 происходил сразу после выбора изображения? Если изображение не выбрано из-за отмены средства выбора изображения, я бы хотел вернуться к просмотру контроллера 1.

import UIKit
import Parse

class UserHome: UIViewController {

var newImage: UIImage?

@IBOutlet weak var welcomeLabel: UILabel!
@IBOutlet weak var imageArea: UIImageView!
@IBOutlet weak var currentUser: UIButton!
@IBAction func tapLogOut(_ sender: Any) {
    PFUser.logOut()
}
@IBAction func tapWeddingInfo(_ sender: Any) {
    opeURLFromString(urlString: weddingURL)
}
@IBAction func tapSlideShow(_ sender: Any) {
    self.performSegue(withIdentifier: "showSlideShow", sender: self)
}
@IBAction func tapAddImage(_ sender: Any) {
    print("tapped add image")
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = false
    self.present(imagePicker, animated: true, completion: nil)
}
override func viewDidLoad() {
    super.viewDidLoad()
    loadPage()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showImageSubmit"{
        let vc = segue.destination as! ImageSubmit
        vc.newImage = newImage
    }
}
func loadPage() {
    print("query a database for images")
    print("load an array with those images")
    // Figure out a way to have images scroll into viewing area
    if let userEmail = PFUser.current()?.username {
        currentUser.setTitle(userEmail, for: [])
    }
    imageArea.image = UIImage(named: userHomeImage)
    welcomeLabel.text = userHomeMsg

    print ("loaded User Home")
    }
}
extension UserHome: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            // Convert image into PFFile data type
            // self.imageArea.image = image
            newImage = image
            self.dismiss(animated: true, completion: nil)
        }
        self.performSegue(withIdentifier: "showImageSubmit", sender: self)
    }

}

1 Ответ

1 голос
/ 01 апреля 2019

Вы можете использовать completion из dismiss метода. После отклонения UIImagePickerController появляется следующий контроллер

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let image = info[.originalImage] as? UIImage else { 
        // dismiss(animated: true)
        return
    }
    // Convert image into PFFile data type
    // self.imageArea.image = image
    newImage = image

    dismiss(animated: true) {
        self.performSegue(withIdentifier: "showImageSubmit", sender: self)
    }
}
...