在不同控制器的函数中使用两个变量

时间:2016-02-02 02:57:01

标签: ios swift

我有一个函数,我想在其中使用来自不同视图控制器的变量和函数中定义的变量。来自不同视图控制器的变量将使用以下代码发送到第二个视图控制器:

func clock(){

    time++

NSNotificationCenter.defaultCenter().postNotificationName("timerValID", object: time)

}


@IBAction func TimerGo(sender: AnyObject) {


    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: ("clock"), userInfo: nil, repeats: true)


}

第二个视图控制器的代码(包含两个变量的函数)是:

override func viewDidLoad() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("location:"), name: "timerValID", object: self.view.window)}


func location(manager: CLLocationManager, didUpdateLocations locations: [AnyObject]!)(notification: NSNotification){

    var startlocation: CLLocation!
    var lastlocation: CLLocation!
    var traveleddistance: Double = 0
    var speed:CLLocationSpeed = CLLocationSpeed()
    let time = notification.object as! NSNumber

}

当我运行应用程序时,我收到消息:由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:无法识别的选择器发送到实例.....

1 个答案:

答案 0 :(得分:0)

错误的重要部分是您错过的部分并替换为“.....”。它会告诉你哪个选择器是问题。

然而,看看你的代码,有几个问题。

首先,使用Swift,您不使用Selector("myFunc"),只需使用“myFunc”即可。此外,“object:”参数是通知的来源。在大多数情况下,您将使用“nil”作为“此消息的任何来源”。所以你会有

     override func viewDidLoad() {
         NSNotificationCenter.defaultCenter().addObserver(self, 
             selector: "location:", name: "timerValID", object: nil)
     }

其次,你的addObserver函数只传递一个对象,即通知。因此,“location:”的签名应为

    func location(notification: NSNotification){     
        //do stuff
    }

这可能是您看到的错误的原因,因为您没有具有预期签名的方法。