NSNotificationCenter addobserver未在SWIFT

时间:2016-05-04 10:26:15

标签: ios swift nsnotificationcenter

我知道这个问题已经被问过很多次了,但是我已经厌倦了寻找这个错误但是无法做到这一点。

我有一个场景,我正在从一个viewController移动到另一个,即(VC1-> VC2)。我正在使用NSNotificationCenter将一些数据传递给另一个VC。

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!")
    }

但我没有调用我的选择器方法。我做了什么问题或什么错误?

使用的版本 - XCode 7.2,SWIFT - 2.1.1

更新 -

我有VC1 - VC2(嵌入在导航控制器中)。我正在使用的segue从VC1连接到VC2的导航控制器。所以我不能使用segue传递。

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

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

如果有任何替代方案,请建议。

4 个答案:

答案 0 :(得分:2)

您在第二个视图控制器可以将自己添加为观察者之前发送了通知。

如果目标是将数据发送到下一个ViewController,我建议使用prepareForSegue

您提到您的第二个ViewController嵌入在Navigation Controller中。没关系。你可以使用这样的东西:

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."
            }
        }
    }
}

你也可以想象并写下这样的事情:

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.

干杯!

答案 1 :(得分:1)

在你发送对象是值发送对象,但你设置自我值,我认为它是一个错误,在代码下面为我工作正常,

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!")
     }

希望它有用

答案 2 :(得分:0)

您可以通过这种方式将数据发送到第二个视图控制器

第一个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"
 }
}

在secondVC

class SecondViewController: UIViewController {
  var name: String?

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

答案 3 :(得分:-1)

在您的代码中,您在VC2 viewdidload中添加了观察者,只有在调用performsegue后才会调用它。因此,在调用perform segue之前,您的通知没有观察者。 解决方案是

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