2017-02-18 4 views
1

Ich habe die härteste Zeit, eine Antwort dafür zu finden.Wie zu Storyboard ViewController aus XIB-Ansicht mit swift 3

Ich habe eine Xib-Ansicht, die in einem Bildlauf befindet, die in einem Ansichtscontroller ist. In der Xib habe ich eine Schaltfläche mit einer Aktion und ich muss zu einem View-Controller, den ich in meinem Storyboard habe, wechseln. Ich möchte auch in der Lage sein, einen benutzerdefinierten Übergang zu verwenden.

Bisher habe ich gelesen, dass ich den Viewcontroller aus dem Storyboard instanziieren kann, um es zu überführen. Aber dann weiß ich nicht, wie ich diesen Controller präsentieren soll.

Dank für jede Hilfe ...

UPDATE:

dies ist der Code, den ich den Übergang auszuführen bin mit.

In Mutterviewcontroller:

static var referenceVC: UIViewController? 


override func viewDidLoad() { 
    super.viewDidLoad() 
    print("viewdidload") 
    LevelSelectViewController.referenceVC = self 

    setupScrollView() 
} 

Code in xib Ansicht Datei

 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sightWordController") 

     let parent = LevelSelectViewController.referenceVC! 

     let segue = InFromRightCustomSegue(identifier: "test", source: parent, destination: vc) 


     segue.perform() 
+1

Segues sind normalerweise nur auf Storyboard-Verwendung beschränkt. Wahrscheinlich müssen Sie Ihre Ansicht (die Sie die gesamte Klasse der Ansicht konfigurieren können, die von einer Spitze geladen werden soll) in das Storyboard einfügen und dann können Sie ein Segment anhängen. Andernfalls werden sie aus einem bestimmten Grund 'UIStoryboardSegue' genannt. – TheCodingArt

+0

Wenn Sie ein benutzerdefiniertes Segment verwenden, das im Code zugewiesen werden kann, brauchen Sie nur eine VC, um das auszuführen, was bedeutet, dass Sie die Responder-Kette hochklettern können, um die zugehörige VC zu finden. Im Allgemeinen klingt es jedoch nach einem benutzerdefinierten Übergang und einer Art Delegatenrückruf. Es gibt absolut keinen Grund, um Ihren Code so kompliziert zu machen, um einen Übergang zu halten. – TheCodingArt

+0

Ich habe es gerade zur Arbeit gebracht. Mein größtes Problem war, einen Verweis auf den übergeordneten Viewcontroller zu bekommen, damit ich das Segment aufrufen kann. Die Art und Weise, wie ich die Referenz bekommen habe, ist ein bisschen wie ein Hack. Ich habe eine statische Referenzvariable im übergeordneten View-Controller erstellt, die ich in der xib-Datei verwenden kann. Gibt es einen besseren Weg, die Referenz zu bekommen? Ich werde die Frage aktualisieren, um meinen Code anzuzeigen. – Discoveringmypath

Antwort

3

Wie in den Kommentaren erwähnt, Segues sind in der Regel die Nutzung im documentation wie erwähnt auf Storyboard beschränkt. Sie können eine benutzerdefinierte Xib-Ansicht in einem Storyboard über @IBDesignable like Ansätze implementieren und haben Sie Ansicht laden von der Xib in die Storyboard-Datei/Klasse. Auf diese Weise profitieren Sie von den Vorteilen beider Welten. Andernfalls können Sie dies auf andere Weise (z. B. delegates/target-action Ereignisse usw.) erreichen.

Sie können auch die responder chain hochklettern und ein Segment aufrufen, das mit dem vom Storyboard geladenen VC in Verbindung steht (das Segment muss nicht unbedingt an eine bestimmte Aktion angehängt sein), indem Sie einen Verweis auf den VC abrufen und das Segment aufrufen. Sie können die Responder-Kette in einer Weise wie dem folgenden Beispielcode klettern:

protocol ChildViewControllerContainer { 
    var parentViewController: UIViewController? { get } 
} 


protocol ViewControllerTraversable { 
    func viewController<T: UIViewController>() -> T? 
} 

extension UIView: ViewControllerTraversable { 

    func viewController<T: UIViewController>() -> T? { 
     var responder = next 

     while let currentResponder = responder { 
      guard responder is T else { 
       responder = currentResponder.next 
       continue 
      } 

      break 
     } 

     return responder as? T 
    } 
} 

extension UITableViewCell: ChildViewControllerContainer { 
    weak var parentViewController: UIViewController? { 
     return viewController() as UIViewController? 
    } 
} 
+0

Danke für die Antwort, ich werde das prüfen. Es sieht definitiv jetzt über meinen Kopf hinweg. Sehen Sie Probleme mit der Art, wie ich es gemacht habe? Ich habe meine Frage so bearbeitet, dass sie den Code enthält, mit dem ich sie erstellt habe. – Discoveringmypath

+0

Sie sollten auf eine statische Variable nicht so verweisen, wie Sie die Eltern-VC referenzieren. Dieses Problem wird durch den obigen Code gelöst. – TheCodingArt

+0

Können Sie Kommentare zu Ihrem Code hinzufügen, um besser zu verstehen, was passiert? – Discoveringmypath

Verwandte Themen