我知道这个问题已经被问过很多次了,但是我已经厌倦了寻找这个错误但是无法做到这一点。
我有一个场景,我正在从一个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
}
}
如果有任何替代方案,请建议。
答案 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."
}
}
干杯!
答案 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中的