2016-07-03 79 views
5

Sto lavorando a un progetto che utilizza il sistema di tabulazioni. Uno degli elementi di tabbar è JobPostingViewController. Lo incoraggio in UINavigationController. C'è un UIButton chiamato add new job in this view controller. Ho implementato pushviewcontroller per andare a CreateJobPostViewController. Lì ho bisogno di aggiungere UIImagePickerController per scegliere l'immagine. Quando tocchi il pulsante Fatto o scelgo un'immagine dalla libreria, la disattiva su JobPostingViewController. Ma dovrebbe andare su CreateJobPostViewController. Qualcuno per favore aiutami. Grazie in anticipo.Il licenziamento di UIImagePickerController comporta la chiusura del controller della vista anche

You can see the issue from this link

Codice in JobPostingViewController

@IBAction func openCreateJob(sender: AnyObject) { 
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("CreateJobPostViewController") as! CreateJobPostViewController 
    self.navigationController?.pushViewController(vc, animated: true) 
} 

Codice in CreateJobPostViewController

@IBAction func addImages(sender: AnyObject) { 
    imagePicker.allowsEditing = false 
    imagePicker.sourceType = .PhotoLibrary 
    presentViewController(imagePicker, animated: true, completion: nil) 
} 
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    picker.dismissViewControllerAnimated(true, completion: nil) 
} 
func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
    picker.dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Non ho mai visto questo problema prima. 'imagePicker' sembra già essere definito prima che venga chiamato 'addImages'. Perché? è usato altrove? C'è altro codice che funziona allo stesso tempo? Inoltre si sta chiamando 'picker.dismissViewControllerAnimated' che si supponga di chiedere al genitore (presentandoViewController) di chiudere il controller modale (ad esempio' self.dismissViewControllerAnimated') non dire al presentato di chiudersi. –

+0

Non ha un altro senso definire imagePicker come variabile globale. Non è usato da nessuna parte. Ho provato entrambe le opzioni che suggerisci di ignorare il controller di visualizzazione del selettore di immagini. Ero stanco di trovare la soluzione e io uso un altro modo. Grazie per il tuo suggerimento. @ Simon McLoughlin – sant05

+0

Puoi pubblicare più codice o spiegare di più il layout dell'app. Ci sono molte persone che evidenziano vari problemi e soluzioni simili. 'JobPostingViewController' è una vista container? o all'interno di una vista container? Come si apre questo schermo? quando il selettore viene rimosso, attiva i metodi 'viewWillAppear' /' viewDidAppear', 'viewDidLayoutSubviews' su' CreateJobPostViewController'. Stai facendo qualcosa dentro questi metodi? –

risposta

4

Aggiunta Picker come visualizzazione secondaria

tenta di aggiungere l'imagepicker come una visualizzazione secondaria al tuo CreateJobPostViewController invece di presentarla e poi rimuoverlo dal genitore nei delegtes

@IBAction func openCreateJob(sender: AnyObject) { 

var picker: UIImagePickerController = UIImagePickerController() 
picker.delegate = self 
picker.allowsEditing = false 
picker.sourceType = .PhotoLibrary 
self.addChildViewController(picker) 
picker.didMoveToParentViewController(self) 
self.view!.addSubview(picker.view!) 
} 

e poi

func imagePickerControllerDidCancel(picker: UIImagePickerController) { 

    picker.view!.removeFromSuperview() 
    picker.removeFromParentViewController() 
    } 

per presentare

mostrando il selettore su currentcontext con opzioni come modifica annulla scegli,

uso picker.modalPresentationStyle = .overCurrentContext // prima di presentarla che

presentViewController(picker, animated: true, completion: nil) 
+0

wow grazie mille :) – sant05

+0

Voglio mostrare il selettore sopra la barra di navigazione e la barra delle schede che significa su schermo intero. Potete per favore aiutarmi? – sant05

+0

Puoi farlo aggiungendo il tuo controller di selezione come sottoview di self.navigationcontroller come [self.navigationController.view addSubview: picker] di – AnshaD

8

Risolto il problema impostando modalPresentationStyle del selettore di immagine da "OverCurrentContext":

picker.modalPresentationStyle = .overCurrentContext 
+1

Questo in realtà lo ha risolto per me. Il metodo viewWillDisappear non veniva più chiamato sul controller della vista di origine. – Alex

+1

Questo è il modo giusto per farlo. La risposta accettata è quella di Hacky. – Basanth

3

si potrebbe usare:

picker.modalPresentationStyle = .overCurrentContext 

ma a seconda dello schermo il layout, può essere meglio usare:

picker.modalPresentationStyle = .overFullScreen 

altrimenti la "cancellazione", "riprendere" e "usare la foto" pulsanti potrebbero non essere visibili.

0

Ho avuto lo stesso problema, l'ho risolto utilizzando lo storyboard (Xcode v9.2)

1 - Andare allo storyboard, dov'è la tua ViewController, selezionarlo

Select ViewController

2 - Imposta presentazione come: Contesto attuale

Set current context

Nota: Se si tratta non funziona Contesto attuale, selezionare Contesto attuale corrente