2016-03-18 16 views
0

Ich habe ViewController mit segue zu secondViewController namens "toSecond". In Viewcontroller laden i customView.xibWie performSegueWithIdentifier von Xib aufrufen?

let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] 

in diesem Custom haben i-Taste mit der Aktion:

viewController().goToSecond() 

in Viewcontroller habe ich Funktion mit diesem Code

func goToSecond() { 
self.performSegueWithIdentifier("toSecond", sender: self) 
} 

aber wenn ich gedrückt button in customView ich werde ein fehler:

viewController has no segue with identifier 'toSecond'

Wenn ich diese Funktion direkt von ViewController aufrufen, funktionieren alle großartig!

Also, wie kann ich PerformSegueWithIdentifier von meinem CustomView aufrufen?

Custom Quellcode:

import UIKit 

class customView: UIView { 

@IBAction func ToSecondButton(sender: AnyObject) { 
viewController().goToSecond() } 

} 

Viewcontroller-Quellcode:

import UIKit 

class viewController: UIViewController { 

... 
let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] 
self.view.addSubview(myCustomView) 
func goToSecond() { 
    self.performSegueWithIdentifier("toSecond", sender: self) 
    } 
... 

} 
+0

Wenn der Besitzer der Datei für die benutzerdefinierte Ansicht der View-Controller ist, ich verstehe nicht, wie dieser Code: ' viewController(). goToSecond() ' ist in Ihrer benutzerdefinierten Ansicht enthalten. Können Sie mehr Quellcode für Ihre benutzerdefinierte Ansicht bereitstellen? Wie erstellen Sie einen Verweis auf den View-Controller in der benutzerdefinierten Ansicht? –

+0

ich präsentiere customView in der Darstellung von viewController ... Mein Übergang zwischen viewController und secondViewController ... ich kann func goToSecond() direkt von viewController aufrufen, kann aber nicht von customView! wenn in der Funktion goToSecond etwas wie print schreiben ("Click!") sehe ich diesen Klick im Log! – Dmitry

+1

In der Zukunft möchte ich Sie ermutigen, bei [Konventionen für die Namenskonvention] zu bleiben (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html#//apple_ref/doc/uid/20001281-1002242-BBCIJGDB), wobei alle Klassennamen mit Großbuchstaben beginnen. Das war unnötig verwirrend ... – Rob

Antwort

1

Das Problem ist, dass Ihr UIView Unterklasse viewController().goToSecond() ruft. Das tut nicht, was du denkst. Die viewController() verweist nicht auf den Ansichtscontroller, der Ihre benutzerdefinierte Ansicht geladen hat. Es instanziiert eine zweite verwaiste Instanz dieser Klasse (die nicht mit einem Storyboard verbunden ist) und kann daher das Segment nicht finden.

Wenn Sie diese benutzerdefinierte UIView Unterklasse einen Segue initiieren möchten, müssen Sie einen Verweis auf den ursprünglichen Ansichtscontroller an die benutzerdefinierte Ansicht übergeben. Fügen Sie der benutzerdefinierten Ansichtsunterklasse, die den Verweis auf ihren Ansichtscontroller enthalten kann, eine Eigenschaft hinzu, und wenn der Ansichtscontroller diese benutzerdefinierte Ansicht instanziiert, muss sie diese Eigenschaft festlegen.


Zum Beispiel:

import UIKit 

protocol CustomViewDelegate: class {   // make this class protocol so you can create `weak` reference 
    func goToNextScene() 
} 

class CustomView: UIView { 

    weak var delegate: CustomViewDelegate? // make this `weak` to avoid strong reference cycle b/w view controller and its views 

    @IBAction func toSecondButton(sender: AnyObject) { 
     delegate?.goToNextScene() 
    } 

} 

Und dann

import UIKit 

class ViewController: UIViewController, CustomViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] as! CustomView 
     myCustomView.delegate = self 

     // ... do whatever else you want with this custom view, adding it to your view hierarchy 
    } 


    func goToNextScene() { 
     performSegueWithIdentifier("toSecond", sender: self) 
    } 

    ... 

} 
+0

Also, wie kann ich das machen? Entschuldigung, wenn meine Fragen töricht ist ... – Dmitry

+1

@Dmitry - Siehe Code-Schnipsel in überarbeiteter Antwort. – Rob

+0

Vielen Dank! – Dmitry