2016-10-30 2 views
2

Meine App-Navigation Flow sieht ein bisschen wie folgt aus:Warum zeigt der Schnittstellen-Generator mein Abwicklungssegment nicht an?

UINavigationController - MasterViewController> DetailViewController> InfoViewController

MasterViewController die folgende Methode enthält:

@IBAction func unwindToMaster(with segue: UIStoryboardSegue) {} 

In DetailViewController, ein ähnliches Verfahren ist es :

@IBAction func unwindToDetail(with segue: UIStoryboardSegue) {} 

Ich benutze diese Methoden zusammen mit UIB-Tasten, um dem Benutzer zu ermöglichen, vorwärts und rückwärts durch die Navigationshierarchie zu gehen. Im Interface Builder sehe ich die Methode unter DetailViewController, wenn ich im InfoViewController mit der rechten Maustaste auf "Beenden" klicke, aber wenn ich in DetailViewController mit der rechten Maustaste auf "Beenden" klicke, werden keine weiteren Abwicklungssegmente angezeigt.

Ich habe mehrere Online-Quellen (Ray Wenderlich, relevante StackOverflow-Fragen) konsultiert, die den korrekten Weg zur Erstellung von Abwicklungssegmenten in Interface Builder anweisen, aber keine davon hat geholfen, das Problem zu lösen. Gerade jetzt, ich brauche Hilfe herauszufinden, was das Problem an erster Stelle ist. Wie Entwicklung normalerweise geht, ist es wahrscheinlich etwas, das mir ins Gesicht starrt.

Exit Menu in DetailViewController — 'unwindToPersonWith:' = 'unwindToDetail'

Ich bin mit Xcode 8.1 mit Swift 3. Danke.

+0

Ich habe es ein paar Umbauten manchmal für Xcode nehmen gesehen alle relevanten Abroller segues zu finden. Wenn Sie das Storyboard säubern, neu erstellen und dann erneut öffnen, hilft das überhaupt? –

+0

Ich würde vorschlagen, das Wort "mit" zu löschen und es durch Unterstreichung ("_") zu ersetzen. Das wird hier erwartet. – matt

+0

Ich habe Ihren Vorschlag einige Male versucht, @ChrisVig, aber es hat nichts im Storyboard geändert. Wie oft mussten Sie in der Vergangenheit für den Builder für Schnittstellen neu aufbauen? – blutie

Antwort

6

, erneut auf: nicht nur eine Aktion für eine Storyboard Unwind Segue hat für einen Abroll-to (Ziel)-View-Controller in der gleichen Quelldatei als class Definition gesetzt werden (zB @IBAction func prepareForUnwind(segue: UIStoryboardSegue), als prepareForUnwind[With]Segue in einer "Presenting Segues" -Liste erkannt, aber auch, dass View Controller kann keine Erweiterungen in jeder sekundären Quelldateien haben. Sie müssen class Definition und alle Erweiterungen in einer einzigen Quelldatei zusammenführen.

(Stand Xcode 8.2.1.)

+0

Wo haben Sie diese Information gefunden? –

+0

Ich würde verrückt werden !!! Was für ein Fehler !! :( – Gabriele

3

Ich konsultierte Apples Developer Library (speziell die Seite "Using Unwind Segues"). Es wird das Beispiel Definition einer Abwickelstation Aktion ist:

@IBAction func unwindToMainMenu(sender: UIStoryboardSegue) { 
    let sourceViewController = sender.sourceViewController 
    // Pull any data from the view controller which initiated the unwind segue. 
} 

in meinem Code dieses Beispiel anwenden, änderte ich meine Abroller Aktion Erklärungen:

@IBAction func unwindToMaster(sender: UIStoryboardSegue) { 
    print("Unwinded to master.") 
} 

und

@IBAction func unwindToDetail(sender: UIStoryboardSegue) { 
    print("Unwinded to detail.") 
} 

ich auch Stellen Sie sicher, dass jede Methode in derselben Datei enthalten ist wie die Klassendeklaration von MasterViewController. Nach weiteren Tests stellte ich fest, dass alle Erweiterungen von MasterViewController in derselben Datei für Interface Builder vorhanden sein mussten, um das Abwicklungssegment zu finden und zu erkennen.

Jetzt, im Storyboard, zeigt das Beenden-Menü beide Abwicklungssegmente. Meine Schlussfolgerung ist, dass durch das Herumspielen, wo die Methoden platziert werden und wie sie deklariert werden, eine Konfiguration gefunden wird, die der Schnittstellenerbauer erkennen kann. Ich hoffe, dass es in Zukunft weniger heikel wird, da meine derzeitige Methodenorganisation sehr lang und schwer zu navigieren ist.

enter image description here

+0

Großartig, dass Sie es gelöst haben! – matt

+0

Ich hatte das gleiche Problem - meine Methodensignatur war korrekt, aber ich hatte eine Erweiterung in einer anderen Datei. Verschieben Sie es zurück in die gleiche Datei behoben. – tylernol

0

In meinem Fall hatte ich eine komplizierte Erbe in meinen Ansicht-Controller und es war ein Grund, warum Interface Builder nicht meine Abroller sehen. Also diese Abhilfe für mich gut funktioniert:

  1. zu YouCollViewController.swift Go-Datei und löschen Sie alle Klassen, Protokolle, Generika, usw. Ihre View-Controller implementiert in Erklärung View-Controller
  2. Inherit Ihre View-Controller von UIViewController
  3. Go auf das Storyboard und Ihre Aktion mit dem unwind zu verbinden, sollte es
  4. in Abwicklungen Liste erscheinen YouCollViewController.swift Datei gehen sie zurück und verwerfen alle Änderungen
0

Weil keine dieser Antworten mir geholfen hat und ich nicht so viel mit meinem Code herumspielen wollte. Hier können Sie eine andere Lösung ausprobieren.

Ab dem Punkt, an dem Sie die Abwicklungsfunktion bereits zu Ihrem MasterViewController hinzugefügt haben.

  1. Zuerst habe ich vorausgegangen und hat einen neuen Viewcontroller zu meinem Storyboard sowie eine neue Cocoa Touch Klasse Dateityp UIViewController und verbunden mit meinem Storyboard ein (ich nannte es den HelperViewController).

  2. Dann können Sie die gleiche Abwicklungsfunktion hinzufügen, die Sie bereits in Ihrem MasterVC zu Ihrem neu erstellten HelperVC haben.

    @IBAction func unwindToMaster(with segue: UIStoryboardSegue) {}

  3. nun die Helfer zu Ihrem DetailVC verbinden. Ihr Storyboard sollte ungefähr so ​​aussehen wie meines. Sie sollten die gleiche Option wie ich erhalten, wenn Sie Strg + Drag-and-Drop zum Beenden Ihrer DetailVC. Wenn die Verbindung hergestellt wurde und Sie den Mauszeiger über den neu erstellten Übergang halten, sollten sowohl der Master als auch der HelperVC hervorgehoben werden. Jetzt können Sie den HelperVC erneut löschen und alles sollte wie erwartet funktionieren.

Ich hoffe, dass das geholfen hat!

My Storyboard

Verwandte Themen