2015-04-10 19 views
5

Tôi có một chức năng:chọn Swift - selector không được công nhận gửi đến dụ

func runRockRotation(rockSprite: SKSpriteNode){ 
    startRockRotationAnimation(rockSprite, isRock: true) 
} 

Khi tôi gọi nó là như thế này:

runRockRotation(rock) 

nó hoạt động, nhưng tôi dường như không thể để có thể đặt nó vào trong bộ chọn NSTimer.

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation:", userInfo: rock, repeats: false) 

đã đọc rất nhiều diễn đàn, cố gắng này:

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation()", userInfo: rock, repeats: false) 
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation(_)", userInfo: rock, repeats: false) 
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation", userInfo: rock, repeats: false) 

Ngoài ra, cố gắng mà không đá, sử dụng con số không, nhưng không có vẻ làm việc.

Mỗi lần tôi nhận được:

2015-04-10 15:49:03.830 Meh[1640:218030] -[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840 
2015-04-10 15:49:03.832 Meh[1640:218030] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840' 

Làm thế nào để gọi chức năng của tôi trong một selector với một tham số? Tôi biết làm thế nào để làm điều đó trong mục tiêu C, nhưng dường như không thể làm điều đó trong Swift. mọi sự giúp đỡ đều được cảm kích.

+0

Bạn đang gọi bộ hẹn giờ ở đâu? Bộ hẹn giờ có được tạo trong lớp bạn đã định nghĩa runRockRotation không? Bạn vượt qua "tự" là mục tiêu, có lẽ đây không phải là những gì bạn cần? – Chackle

+0

sử dụng: 'selector:" runRockRotation: "' – duan

Trả lời

8

Kiểm tra các tài liệu cho scheduledTimerWithTimeInterval

Bạn sẽ thấy rằng

Bộ chọn nên có chữ ký sau đây: timerFireMethod: (bao gồm cả dấu hai chấm để chỉ ra rằng phương pháp này có một đối số).

Các timer trôi qua bản thân như là đối số, do đó phương pháp này sẽ áp dụng các mẫu sau: - (void)timerFireMethod:(NSTimer *)timer

Chức năng của bạn không phù hợp với mô hình này, vì vậy chọn thích hợp không thể được tìm thấy.

Sử dụng một cái gì đó giống như -

func runRockRotationForTimer(_ timer: NSTimer){ 
    self.runRockRotation(timer.userInfo as? SKSpriteNode) 
    timer.invalidate(); 
} 

và sắp xếp nó bằng cách sử

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotationForTimer:", userInfo: rock, repeats: false) 
+0

FWIW Tôi cũng phải công khai func của tôi – dbro

2

Cũng giúp đảm bảo các đối tượng mục tiêu (tự trong trường hợp của bạn) là một lớp con của NSObject

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: <THIS MUST BE NSOBJECT SUBCLASS>, selector: "runRockRotation:", userInfo: rock, repeats: false) 
Các vấn đề liên quan