2017-09-20 5 views
1

Ceci est ma première question, j'espère que ce ne sera pas trop bête.Afficher le contrôleur ne s'affiche pas en raison d'une autre vue présentée n'ont pas terminé.

Voici mon application:
VC1
VC2 - ChatTableViewController
VC3 - PopupPhotoSourceVC

VC1 - un bouton pour présenter VC2 modalement
VC2 - un bouton "Bar" pour présenter VC3 modalement (VC3 présentation définie sur "Over Current Context")
VC2 - définir un segue segue

VC3 - deux boutons au milieu, tous deux réglés sur ci-dessus, déroulent la séquence par glissement et sélectionnent en utilisant StoryBoard.

intérieur VC3, utilisez préparer Segue pour laisser VC2 sait ce que l'utilisateur choisir

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let destChatViewController = segue.destination as! ChatTableViewController 


    if segue.identifier == "library" // library Button 
    { 
     print("set cameraType to library from popupviewcontroller") 
     let time = getCurrentTime() 
     print("==== timer start ====== \(time.3):\(time.4):\(time.5)") 

     destChatViewController.cameraType = "library" 
    } 
    else if segue.identifier == "newphoto" // newphoto Button 
    { 
     print("set cameraType to newphoto from popupviewcontroller") 
     let time = getCurrentTime() 
     print("==== timer start ====== \(time.3):\(time.4):\(time.5)") 

     destChatViewController.cameraType = "newphoto" 
    } 

    // for unwind segue, no need to call dismiss 
    print("not calling dismiss pop up") 
    let time = getCurrentTime() 
    print("==== timer start ====== \(time.3):\(time.4):\(time.5)") 

    //dismiss(animated: true, completion: nil) 
} 

intérieur VC2, attachPhotoButtonFinish va essayer d'appeler le contrôleur de sélecteur d'image en fonction du choix de l'utilisateur

func attachPhotoButtonFinish() { 

    print("attachphotobutton start") 
    let time = getCurrentTime() 
    print("==== timer start ====== \(time.3):\(time.4):\(time.5)") 


    let image = UIImagePickerController() 
    image.delegate = self 

    if cameraType == "library"{ 
     image.sourceType = UIImagePickerControllerSourceType.photoLibrary 

    } 
    else if cameraType == "newphoto"{ 
     image.sourceType = UIImagePickerControllerSourceType.camera 
     image.cameraCaptureMode = .photo 
    } 
    else{ 
     print("Something wrong!!!") 
     return 
    } 
    image.allowsEditing = false 
    image.modalPresentationStyle = .overCurrentContext 

    print("calling imagepicker") 
    let time1 = getCurrentTime() 
    print("==== timer start ====== \(time1.3):\(time1.4):\(time1.5)") 

    self.present(image, animated: true, completion: nil) 
} 

Et moi aussi essayer d'imprimer le temps deinit de VC3

deinit{ 
    print("===== \(self.classForCoder.description()) be deinit") 
    let time = getCurrentTime() 
    print("==== timer start ====== \(time.3):\(time.4):\(time.5)") 

} 

A propos du résultat d'exécution, parfois (1 sur 10) VC3 se termine avant VC2 présent sélecteur d'image. Donc je peux le voir s'afficher correctement.

timer ==== début ====== 18:34:58
ne pas appeler rejeter pop up
timer ==== début ====== 18:34:58
à ChatTableViewController délasser et cameraType = bibliothèque
timer ==== début ====== 18:34:58
attachphotobutton start
minuterie ==== début ====== 18:34:58
en train d'appeler imagepicker
==== départ différé ====== 18:34:58
===== PhotoStreamSourceTest.PopupPhotoSourceVC être deinit
minuterie ==== début ====== 18:34:59
20/09/2017 18: 34: 59,274464 + 0800 PhotoStreamSourceTest [14690: 399530] [AXRun-PID] Client demandant la suspension du PID: 14706 Nom:
2017-09-20 18: 34: 59.283271 + 0800 PhotoStreamSourceTest [14690: 399463] [MC] Le conteneur du groupe de systèmes pour le chemin systemgroup.com.apple.configurationprofiles est /Users/_/Library/Developer/CoreSimulator/Devices/54B3F249-2C6A-4C18-B2E1-C7271199A7CF/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-09-20 18: 34: 59.284012 +0800 PhotoStreamSourceTest [14690: 399463] [MC] Lecture à partir de paramètres privés effectifs.

Mais la plupart du temps, je reçois le résultat suivant et le sélecteur d'image ne s'affiche pas.

timer ==== début ====== 18:35:48
ne pas appeler rejeter pop up
timer ==== début ====== 18:35:48
à ChatTableViewController délasser et cameraType = bibliothèque
timer ==== début ====== 18:35:48
attachphotobutton start
minuterie ==== début ====== 18:35:48
en train d'appeler imagepicker
==== départ différé ====== 18:35:48
2017-09-20 18: 35: 48.967515 + 0800 PhotoStreamSourceTest [14690: 400836] [AXRun-PID] Client demandant la suspension du PID: 14706 Nom:
2017-09-20 18: 35: 49.049357 + 0800 PhotoStreamSourceTest [ 14690: 399463] Avertissement: Tenter de vous présenter pendant qu'une présentation est en cours!
===== PhotoStreamSourceTest.PopupPhotoSourceVC être deinit
minuterie ==== début ====== 18:35:49

Merci!

+0

jetez un oeil à ce [Signification de l'avertissement "alors qu'une présentation est en cours!"] (Https://stackoverflow.com/a/17120065/4056108) – chirag90

+1

@ chirag90 Merci pour votre réponse rapide. Je me demande juste si le segue ne convient pas à ce scénario. Assurez-vous que VC3 est fermé avant d'appeler le sélecteur d'image est définitivement la règle. – Hungo

+0

Désolé Mate, j'aidais juste avec l'avertissement – chirag90

Répondre

0

Merci à @ chirag90 « s lien Meaning of Warning “while a presentation is in progress!

Le point clé est d'utiliser le bloc d'achèvement de rejeter la méthode pour vous assurer que VC3 est vraiment fermé avant de laisser VC2 pour lancer sélecteur d'image .

Après l'utilisation de la solution, déléguez plutôt que de dérouler la séquence. Si quelqu'un a une autre approche s'il vous plaît faites le moi savoir! Je vous remercie! Tout d'abord, sur VC3, supprimez la séquence de déroulement des deux boutons de Storyboard. Puis ajouter IBAction sur les deux boutons appelés libraryButtonPressed() et takePhotoButtonPressed()

Sur VC3: PopupPhotoSourceVC, ajouter un protocole

protocol PopupPhotoSourceVCDelegate { 
func finishPassing(string: String)} 

Sur VC3 également ajouter une variable de délégué de ce type

var delegate: PopupPhotoSourceVCDelegate? 

Maintenant sur VC2, adopter le protocole

class ChatTableViewController: UITableViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, PopupPhotoSourceVCDelegate{ 

Et mettre en œuvre fonction e finishPassing d'obéir au protocole

func finishPassing(string: String) { 
    cameraType = string 
    attachPhotoButtonFinish() 
} 

Ne pas oublier de mettre délégué à l'auto

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destination = segue.destination as? PopupPhotoSourceVC{ 
     destination.delegate = self 
    } 
} 

Maintenant, revenons à VC3, nous allons mettre en œuvre les principales méthodes

@IBAction func libraryButtonPressed(_ sender: UIButton) { 
    dismiss(animated: true) { 
     self.delegate?.finishPassing(string: "library") 
    } 

} 
@IBAction func takePhotoButtonPressed(_ sender: UIButton) { 
    dismiss(animated: true) { 
     self.delegate?.finishPassing(string: "newphoto") 
    } 
} 

Ces deux Les méthodes vont ignorer le VC3: PopupPhotoSourceVC et après l'avoir renvoyé est réellement terminé, puis appelle finishPassing dans VC2: ChatTableViewController pour démarrer le sélecteur d'image de lancement.

Espérons que cette aide, merci.