2016-07-03 7 views
5

Ich arbeite an einem Projekt, das Tabbar-System verwendet. Eine der Registerkarten ist JobPostingViewController. Ich habe es in UINavigationController eingebettet. Es gibt eine UIButton namens aufgerufen neuen Job in diesem View-Controller. Ich implementierte Pushviewcontroller zu gehen CreateJobPostViewController. Dort muss ich UIImagePickerController hinzufügen, um das Bild auszuwählen. Wenn ich auf die Schaltfläche Fertig klicke oder ein Bild aus der Bibliothek wähle, wird es an JobPostingViewController zurückgegeben. Aber es sollte zum CreateJobPostViewController gehen. Bitte helfen Sie mir. Danke im Voraus.Dismissing von UIImagePickerController displisses präsentiert View Controller auch

You can see the issue from this link

-Code in JobPostingViewController

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

-Code 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

Ich habe dieses Problem noch nie zuvor gesehen. 'imagePicker' scheint bereits definiert zu sein, bevor 'addImages' aufgerufen wird. Warum? Wird das woanders benutzt? Gibt es einen anderen Code, der gleichzeitig funktioniert? Außerdem rufen Sie 'picker.dismissViewControllerAnimated' auf, und Sie sollen das übergeordnete Element (presentingViewController) auffordern, den modalen Controller (d. H.' Self.dismissViewControllerAnimated') zu verwerfen und dem Dargestellten nicht zu sagen, dass er sich selbst abweisen soll. –

+0

Es macht keinen anderen Sinn, imagePicker als globale Variable zu definieren. Es wird nirgends verwendet. Ich habe beide Optionen ausprobiert, um den Bildauswahl-Controller zu schließen. Ich war es leid, die Lösung zu finden, und ich benutze einen anderen Weg. Danke für deinen Vorschlag. @ Simon McLoughlin – sant05

+0

Können Sie mehr Code oder erklären Sie das Layout der App mehr. Es gibt viele Leute, die verschiedene ähnliche Probleme und Lösungen hervorheben. Ist 'JobPostingViewController' eine Containeransicht? oder in einer Containeransicht? Wie wird dieser Bildschirm geöffnet? Wenn die Auswahl aufgehoben wird, werden die Methoden 'viewWillAppear' /' viewDidAppear', 'viewDidLayoutSubviews' auf' CreateJobPostViewController' ausgelöst. Machst du etwas in diesen Methoden? –

Antwort

4

Hinzufügen Picker als Subview

versuchen, die imagepicker als ein Subview zu Ihrem CreateJobPostViewController hinzuzufügen insted es zu präsentieren und es dann in den 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!) 
} 

und dann

func imagePickerControllerDidCancel(picker: UIImagePickerController) { 

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

Für präsentiert

von den Eltern entfernen

zeigt Picker über aktuellen Kontext mit Optionen wie Bearbeiten Abbrechen wählen,

Verwendung picker.modalPresentationStyle = .overCurrentContext // vor präsentiert es

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

wow vielen Dank :) – sant05

+0

Ich möchte Picker über Navigationsleiste und Tab-Leiste, die über den ganzen Bildschirm bedeutet. Kannst du mir bitte helfen? – sant05

+0

Sie können das tun, indem Sie Ihren Picker-Controller als Unteransicht von self.navigationcontroller wie [self.navigationController.view addSubview: Picker] von – AnshaD

8

das Problem wurde behoben, durch den Bild Pickers modalPresentationStyle auf "OverCurrentContext":

picker.modalPresentationStyle = .overCurrentContext 
+1

Dies tatsächlich für mich behoben. Die ViewWillDisappear-Methode wurde nicht mehr auf dem ursprünglichen Ansichtscontroller aufgerufen. – Alex

+1

Dies ist der richtige Weg, es zu tun. Die angenommene Antwort ist eine Hacky. – Basanth

3

Sie könnten verwenden:

picker.modalPresentationStyle = .overCurrentContext 

aber abhängig von Ihrem Bildschirm Layout, kann es besser sein zu verwenden:

picker.modalPresentationStyle = .overFullScreen 

sonst Ihr „Abbrechen“, „zurückzuerobern“ und „verwendet photo“ Tasten möglicherweise nicht sichtbar.

0

Ich hatte das gleiche Problem, löste ich es mit dem Storyboard (Xcode v9.2)

1 - Gehen Sie auf das Storyboard, wo ist dein Viewcontroller, wählen Sie es

Select ViewController

2 - Set Darstellung als: aktuelle Kontext

Set current context

Hinweis: Wenn es funktioniert nicht im aktuellen Kontext, wählen Sie Über den aktuellen Kontext

Verwandte Themen