2017-07-03 8 views
1

Ich versuche lable eines View-Controller von einem anderen View-Controller zu ändern eigenes Protokoll verwenden, aber seine delegierte Methode ist nichtBenutzerdefinierte Protokoll Delegatmethode nicht Aufruf

ViewController3 Code aufgerufen werden:

wenn ich schließen klicken Sie auf Button es ist Delegate-Methode wird nicht in meinem ViewController2 aufgerufen.

protocol ViewController3Delegate: class { 

    func changeLable(_ text: String) 
} 

class ViewController3: UIViewController { 

    weak var delegate: ViewController3Delegate? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

    } 

    @IBAction func btnCloseAction(_ sender: Any) { 

    delegate?.changeLable("fillter applied") 
    self.dismiss(animated: true, completion: nil) 
    } 
} 

ViewController2 Code:

class ViewController2: UIViewController,ViewController3Delegate { 

    @IBOutlet weak var lblReport: UILabel! 

    let VC3 = ViewController3(nibName: "ViewController3", bundle: nil) 

    override func viewDidLoad() { 

    super.viewDidLoad() 
    VC3.delegate = self 
    } 

    func changeLable(_ text: String) { 

    print("delegate called") 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

    } 
} 

Jeder weiß, wo ich falsch bin, schlagen mir bitte etwas Lösung

+0

definieren, wie Sie nicht hinzufügen 'VC3.view' als Unteransicht, ich vermute, Sie haben zwei' ViewController3' Instanzen. On als Ihre Eigenschaft in 'ViewController2' (die Sie nicht sehen) und eine, für die wir den Code nicht sehen. Vielleicht vom Storyboard instanziiert. 'ViewController2'' 'btnCloseAction' 'wird aufgerufen, aber sein' Delegat' ist nicht gesetzt. – shallowThought

+0

@ShallowThought, was die Lösung ist, hatte ich viele Alternativen versucht, aber es funktioniert nicht. –

+0

Haben Sie meinen Verdächtigen verstanden? – shallowThought

Antwort

0

Sie sollten zuerst vorhanden ViewController3 von ViewController2 wie folgt aus:

let VC3 = ViewController3(nibName: "ViewController3", bundle: nil) 
VC3.delegate = self 
self.presentViewController(VC3, animated: true, completion: nil) 

Sie können auch löschen diese Zeile über viewDidLoad

let VC3 = ViewController3(nibName: "ViewController3", bundle: nil) 
0

Sie haben keine Delegierten in Ihrem ViewController2 definiert, die an den Delegaten in ViewController3 verwendet wird.

Dieser:

protocol ViewController3Delegate: class { 

     func changeLable(_ text: String) 
    } 

    class ViewController3: UIViewController { 

     weak var delegate: ViewController3Delegate? 

     override func viewDidLoad() { 
     super.viewDidLoad() 

     } 

     override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

     } 

     @IBAction func btnCloseAction(_ sender: Any) { 
     if delgate !=nil { 

     delegate?.changeLable("fillter applied") 
     self.dismiss(animated: true, completion: nil) 
    } 
     } 
    } 

Und dann in Ihrer ViewController2 Klasse:

class ViewController2: UIViewController,ViewController3Delegate { 

     @IBOutlet weak var lblReport: UILabel! 


     override func viewDidLoad() { 

     super.viewDidLoad() 
     } 

     func changeLable(_ text: String) { 

     print("delegate called") 
     } 

     override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

     } 
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
      { 

       if segue.identifier = "Yoursegueientifier" 
        { 
        let vc = segue.destination as! ViewController3 
        vc.delegate = self 
        }     
      } 
    } 

Hinweis: Sie haben Ihre segueidentifer Namen in Ihrem Storyboard

+0

danke für den Vorschlag, aber mit meinem Fall ist es anders ich habe Tabbar-Controller mit 3 Tabs, so dass es nicht funktioniert, wenn Sie wissen, wie Sie mit Delegat mit Tabbar arbeiten bitte schlagen Sie mir eine Lösung –

+0

so Sie wollen Daten zwischen Tabs weitergeben? –

+0

ja, es ist wie anwenden Filter, ich habe Tabbar-Controller mit 3 Tabs, erste und dritte Registerkarte enthalten Daten, welche Filter angewendet werden kann von Registerkarte 2 auf Registerkarte 2 eine Ansicht wird angezeigt, um Filter Optionen basierend auf Filterdaten zeigen sollte gefiltert es kann erste Ansicht oder dritte Ansicht ist es egal, ich habe versucht, mit Delegierten auf Tabbar-Controller arbeiten es funktioniert Ich weiß nicht den Grund, warum es nicht mit anderen Controller funktioniert –

Verwandte Themen