2016-06-01 7 views
2

Wie führe ich einen Wechsel von der Containeransicht innerhalb einer vom Navigationscontroller angezeigten Ansicht durch?

Ich möchte von einem Sichtcontainer innerhalb von "H" segmentieren, der mit dem Navigationscontroller dargestellt wird, der mit dem Split View Controller verbunden ist. Wie kann ich das erreichen? Ich habe versucht, reguläre performSegueWithIdentifier mit lokal verknüpften Storyboard-IDs, aber das Entfernen der oberen Navigationsleiste. Ich möchte die obere Navigationsleiste beibehalten und den Übergang so ausführen, als ob der Master-Navigationscontroller verwendet wurde (Zeilen, die auswählen, welcher Ansichtscontroller in der Detailansicht angezeigt wird).

Jede Hilfe wird sehr geschätzt!

Antwort

4

Hier ist ein Beispiel, wie Sie einen Übergang von einem eingebetteten ViewController durchführen können.

Sample Storyboard


ViewController.swift

import UIKit 

protocol SegueHandler: class { 
    func segueToNext(identifier: String) 
} 

class ViewController: UIViewController, SegueHandler { 

    func segueToNext(identifier: String) { 
     self.performSegueWithIdentifier(identifier, sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "EmbedH" { 
      let dvc = segue.destinationViewController as! HViewController 
      dvc.delegate = self 
     } 
    } 
} 

HViewController.swift

import UIKit 

class HViewController: UIViewController { 

    weak var delegate: SegueHandler? 

    @IBAction func pressH(sender: UIButton) { 
     delegate?.segueToNext("GoToGreen") 
    } 

} 

Setup:

  1. Verwenden Delegation haben die HViewController seine Einbettung Viewcontroller erzählen die Segue auszuführen.
  2. Erstellen Sie ein Protokoll mit dem Namen SegueHandler, das nur eine Klasse beschreibt, die die Methode segueToNext(identifier: String) implementiert.

    protocol SegueHandler: class { 
        func segueToNext(identifier: String) 
    } 
    
  3. Machen Sie Ihre Viewcontroller dieses Protokoll implementieren, indem sie auf die class Deklarationszeile hinzu:

    class ViewController: UIViewController, SegueHandler { 
    

    und durch die gewünschte Funktion zu implementieren.

  4. eine delegate Eigenschaft HViewController hinzufügen:

    weak var delegate: SegueHandler? 
    
  5. Klicken Sie auf das embed segue Pfeil zwischen Viewcontroller und HViewController. Geben Sie die ID "EmbedH" im Attribute Inspector ein.

  6. erstellen zeigen segue zwischen Viewcontroller und dem GreenViewController von Steuer vom Viewcontroller Symbol an der Spitze des Viewcontroller zum GreenViewController ziehen. Benennen Sie diesen Abschnitt "GoToGreen" im Attribute Inspector.

  7. In prepareForSegue für Viewcontroller, wenn die "EmbedH" segue Fall die delegate Eigenschaft HViewController zu self (Viewcontroller).

  8. Wenn der Benutzer auf die Schaltfläche H im Feld HViewController klickt, rufen Sie delegate?.segueToNext("GoToGreen") auf, um das Segment in ViewController auszulösen.


Hier wird im Simulator ausgeführt wird:

Simulator Demonstration

+0

Zunächst einmal vielen Dank für die ausführliche Antwort. :) Ich werde versuchen, dies später zu implementieren und zu sehen, ob ich es in meiner Test-App zum Laufen bringen kann. Ich habe das beabsichtigte Verhalten, BTW, durch Hinzufügen von Show Detail Segues in den entsprechenden Storyboards. Wenn ich dann "self.performSegueWithIdentifier" anrufe, bleiben die Navigationsleiste und die Schaltflächen wie vorgesehen erhalten (Historie der Ansichten beibehalten usw.). Ist etwas falsch damit, es so zu machen? – Plastus

+0

Ich bin nicht klar, wie genau Sie es getan haben. Wenn das, was Sie getan haben, funktioniert, fügen Sie es als Antwort hinzu (Sie dürfen Ihre eigene Frage zu Stack Overflow beantworten). Seien Sie in Ihrer Antwort spezifisch, wie Sie die Übergänge einrichten und wie Sie sie anrufen und von wo. – vacawama

+0

So zerstört/instanziiert meine Methode einen neuen View-Controller jedes Mal, wenn er vom Master-Navigations-Controller aufgerufen wird (anstatt in der VC der Haupt-App). Das ist nicht gut, weil ich dort irgendwelche Benutzeränderungen in den Daten beibehalten möchte. Ich habe versucht, Ihre Methode zu implementieren, aber wenn ich auf eine Schaltfläche klicke, sitzt sie einfach dort. Weder "prepareForSegue" noch "segueToNext" werden aufgerufen. Das Äquivalent von "HViewController" befindet sich in der "H" Storyboard-Referenz auf dem Bild, das ich zuvor hochgeladen habe. – Plastus

0

Ich war, um genau das, was @vacawama hier vorgeschlagen, obwohl ich das nicht reproduzieren konnte, habe ich versucht, genau Ihre Schritte aber self.delegate?.segueToNext("GoToGreen") wurde aufgerufen, aber weder das Protokoll selbst noch der Container-View-Controller. Nachdem ich einen ganzen Tag lang nach diesem Ansatz gesucht hatte, erkannte ich, dass das Problem bei der schnellen Version lag. Gerade diese ersetzen:

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "EmbedH" { 
     let dvc = segue.destination as! HViewController 
     dvc.delegate = self 
    } 
} 

hierfür:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "EmbedH" { 
     let dvc = segue.destination as! HViewController 
     dvc.delegate = self 
    } 
} 

Andere Detail Ich war über das eingebettete segue fehlte. Stellen Sie sicher, dass Sie die Containeransicht mit dem ViewController und nicht mit dem Viewcontroller selbst verbinden, da sonst die Option Einbetten für den Abschnitt nicht angezeigt wird.

Verwandte Themen