2016-05-04 7 views
1

Ich weiß, dass diese Frage schon oft gestellt wurde, aber ich bin es verdammt leid, nach diesem Fehler zu suchen, konnte es aber nicht schaffen.NSNotificationCenter addobserver ruft die selector-Methode nicht in SWIFT

Ich habe ein Szenario, in dem ich von einem ViewController zu einem anderen wechseln, d. H. (VC1-> VC2). Ich verwende NSNotificationCenter, um einige Daten an die andere VC zu übergeben.

VC1 -

@IBAction func sendNotfctn(sender: AnyObject) 
    { 
     NSNotificationCenter.defaultCenter().postNotificationName("MY NOTIFICATION", object: self) 
     performSegueWithIdentifier("Go", sender: self)//Here I move to VC2. 
    } 

VC2

override func viewDidLoad() 
    { 
     super.viewDidLoad() 


     NSNotificationCenter.defaultCenter().addObserver(self, selector: "actOnMyNotification:", name: "MY NOTIFICATION", object: nil) 

     // Do any additional setup after loading the view. 
    } 
func actOnMyNotification(notification:NSNotification) 
    { 
     print("I recived the notification!") 
    } 

Aber meine Wähler Methode wird nicht aufgerufen. Welches Problem oder welchen Fehler mache ich?

verwendet Version - XCode 7.2, SWIFT - 2.1.1

Update -

Ich habe VC1 - VC2 (eingebettet in Navigation-Controller). Der von mir verwendete Kanal ist von VC1 mit dem Navigationscontroller von VC2 verbunden. Daher kann ich die Überfahrt nicht verwenden.

Überschreibung func prepareForSegue (segue: UIStoryboardSegue, Absender: ANYOBJECT) {

if segue.identifier == "Go" 
    { 
     let destVC = segue.destinationViewController as! VC1//this line is not possible for my above said case 
    } 
} 

Wenn irgendwelche Alternativen bitte vorschlagen.

+1

schicken Dies wird wahrscheinlich funktioniert nicht, da die Benachrichtigung zuerst gepostet wird und Ihr Beobachter nicht darauf eingestellt ist. –

+0

Sehen Sie diese Tutorials: https://iosdevcenters.blogspot.com/2016/03/nsnotification-nsnotificationcenter-in.html –

+1

Dieser Doen ruft nicht, wegen des Aufrufs PostNotification vor dem Hinzufügen des Beobachters. –

Antwort

2

Sie haben die Benachrichtigung gesendet, bevor sich der zweite Ansichtscontroller als Beobachter hinzufügen konnte.

Wenn das Ziel darin besteht, Daten an den nächsten ViewController zu senden, empfehle ich die Verwendung von prepareForSegue.

Sie erwähnten, dass Ihr zweiter ViewController in eine Navigation Controller eingebettet ist. Das ist ok. Sie können so etwas wie folgt verwenden:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if let navigationController = segue.destinationViewController as? UINavigationController, 
     myTargetViewController = navigationController.topViewController as? MyTargetViewController 
     where segue.identifier == "YOUR_IDENTIFIER" { 

     myTargetViewController.myStringVar = "My string value." 
    } 
} 

As explained here.

Prost:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "YOUR_IDENTIFIER" { 

     // The destination ViewController is a NavigationController. 
     // The top ViewController of the NavigationController is your target. 
     // In this example we are just setting a String in the destination ViewController. 
     if let navigationController = segue.destinationViewController as? UINavigationController { 

      if let myTargetViewController = navigationController.topViewController as? MyTargetViewController { 
       myTargetViewController.myStringVar = "My string value." 
      } 
     } 
    } 
} 

Sie können auch die gleiche Sache wie diese Phantasie und schreiben sein!

+0

Passt zu meiner Anforderung –

+0

Ich bin froh, dass es geholfen hat. Prost! –

+0

Also, wenn wir wollen, können wir auf andere VCs im Navigationsstapel zugreifen? –

1

In Sie senden Objektwert-Objekt senden, aber Sie setzen Selbst Wert, ich glaube, es ist ein Fehler, ok Code unten seine für mich arbeiten,

VC 1:

@IBAction func sendNotfctn(sender: AnyObject) 
    { 
     NSNotificationCenter.defaultCenter().postNotificationName("PostNotificationName", object: nil) 
    } 

VC 2:

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().removeObserver(self) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "actOnMyNotification:", name:"PostNotificationName", object: nil) 

     // Do any additional setup after loading the view. 
    } 

func actOnMyNotification(notification:NSNotification) 
    { 

     print("I recived the notification!") 
    } 

hoffen, seine hilfreich

+0

Sorry funktioniert nicht ..... !! –

-1

In Ihrem Code fügen Sie Beobachter in der VC2 viewdidload hinzu und es wird nur aufgerufen, nachdem Sie perfecsegue aufgerufen haben.So, bis Sie die Funktion "Übergehen" aufrufen, hat Ihre Benachrichtigung keinen Beobachter. Die Lösung ist

@IBAction func sendNotfctn(sender: AnyObject) 
{ 
performSegueWithIdentifier("Go", sender: self)//Here I move to VC2. 
NSNotificationCenter.defaultCenter().postNotificationName("MY NOTIFICATION", object: self) 
} 

in VC1

0

Sie Daten auf den zweiten View-Controller auf diese Weise

in erster VC

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

if segue.identifier == "Go" 
    { 
    let destVC = segue.destinationViewController as! SecondViewController // this must be your destintationviewcontroller name 
    destVC.name = "hello" 
} 
} 

in secondVC

class SecondViewController: UIViewController { 
    var name: String? 

    override func viewDidLoad() 
    { 
    super.viewDidLoad() 
    print(self.name) // prints Hello 
} 
}