如何使用 Swift 选择器?选择器不断导致“类型没有成员”
How to use Swift Selector? Selector constantly results to `Type has no member`
我正在努力处理以下代码:
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
我似乎无法让#selector 工作。此代码结果为:
Type 'GameViewController' has no member 'addNext'
即使会员就在那里......这是完整的代码:
class GameViewController: GAITrackedViewController, AVAudioPlayerDelegate {
var sceneCanvas: SKSpriteNode?
override func viewDidLoad() {
skView.presentScene(WelcomeScene(size: view.bounds.size, gvc: self))
}
func createBackground(boundsSize: CGRect, gvc: GameViewController) -> SKSpriteNode {
addUILabels(gvc)
return sceneCanvas!
}
func addUILabels(gvc: GameViewController) {
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
}
public func addNext() {
let backgroundLabel = SKSpriteNode(imageNamed: "label1.png")
sceneCanvas!.addChild(backgroundLabel!)
backgroundLabel?.runAction(SKAction.moveByX(-screenSize.width , y: 0, duration: 12))
}
}
class WelcomeScene: SKScene {
init(size: CGSize, gvc: GameViewController){
super.init ()
let bounds = CGRect(origin: CGPoint(x: 0,y: 0), size: size)
sceneCanvas = createBackground(bounds, gvc: gvc)
self.addChild(sceneCanvas!)
}
}
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("addNext"), userInfo: nil, repeats: true)
可能您的代码在不同的模块中。如果是这样,您应该 func addNext()
public:
public func addNext() {
...
}
你试过了吗
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
或
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(gvc.addNext), userInfo: nil, repeats: true)
原来有两个问题。 1) 我已经在 class 之外定义了方法,2) 但是它的工作还需要以下语法:
selector: #selector(addNext as () -> ())
我 运行 与 UILongPressGestureRecognizer
和 Swift 3 一起陷入这个问题。
我在 table 视图单元格的长按扩展中使用了我的方法:
// Long press table view extension
extension MyViewController: UIGestureRecognizerDelegate {
public func handleLongPress(longPressGesture: UILongPressGestureRecognizer) {
let p = longPressGesture.location(in: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: p)
if indexPath == nil {
print("Long press on table view, not row.")
}
else if (longPressGesture.state == UIGestureRecognizerState.began) {
print("Long press on row, at \(indexPath!.row)")
}
}
}
然后,在我的 viewDidLoad()
:
// Configure long press on tableviewcell
let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(MyViewController.handleLongPress))
longPressGesture.minimumPressDuration = 1.0 // 1 second press
longPressGesture.delegate = self
self.tableView.addGestureRecognizer(longPressGesture)
对我来说,通过对选择器使用以下语法解决了这个问题:
action: #selector(MyViewController.handleLongPress)
我尝试了以下替代方案,但没有任何运气。 这些都不行:
action: #selector(self.handleLongPress)
action: #selector(MyViewController.handleLongPress(_:))
action: #selector(self.handleLongPress(_:))
action: #selector("handleLongPress(_:)")
此外,即使我似乎没有将任何参数传递给 MyViewController.handleLongPress
,选定的行在长按选择时打印到控制台也很好:
Long press on row, at 5
我正在努力处理以下代码:
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
我似乎无法让#selector 工作。此代码结果为:
Type 'GameViewController' has no member 'addNext'
即使会员就在那里......这是完整的代码:
class GameViewController: GAITrackedViewController, AVAudioPlayerDelegate {
var sceneCanvas: SKSpriteNode?
override func viewDidLoad() {
skView.presentScene(WelcomeScene(size: view.bounds.size, gvc: self))
}
func createBackground(boundsSize: CGRect, gvc: GameViewController) -> SKSpriteNode {
addUILabels(gvc)
return sceneCanvas!
}
func addUILabels(gvc: GameViewController) {
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
}
public func addNext() {
let backgroundLabel = SKSpriteNode(imageNamed: "label1.png")
sceneCanvas!.addChild(backgroundLabel!)
backgroundLabel?.runAction(SKAction.moveByX(-screenSize.width , y: 0, duration: 12))
}
}
class WelcomeScene: SKScene {
init(size: CGSize, gvc: GameViewController){
super.init ()
let bounds = CGRect(origin: CGPoint(x: 0,y: 0), size: size)
sceneCanvas = createBackground(bounds, gvc: gvc)
self.addChild(sceneCanvas!)
}
}
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("addNext"), userInfo: nil, repeats: true)
可能您的代码在不同的模块中。如果是这样,您应该 func addNext()
public:
public func addNext() {
...
}
你试过了吗
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true)
或
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(gvc.addNext), userInfo: nil, repeats: true)
原来有两个问题。 1) 我已经在 class 之外定义了方法,2) 但是它的工作还需要以下语法:
selector: #selector(addNext as () -> ())
我 运行 与 UILongPressGestureRecognizer
和 Swift 3 一起陷入这个问题。
我在 table 视图单元格的长按扩展中使用了我的方法:
// Long press table view extension
extension MyViewController: UIGestureRecognizerDelegate {
public func handleLongPress(longPressGesture: UILongPressGestureRecognizer) {
let p = longPressGesture.location(in: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: p)
if indexPath == nil {
print("Long press on table view, not row.")
}
else if (longPressGesture.state == UIGestureRecognizerState.began) {
print("Long press on row, at \(indexPath!.row)")
}
}
}
然后,在我的 viewDidLoad()
:
// Configure long press on tableviewcell
let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(MyViewController.handleLongPress))
longPressGesture.minimumPressDuration = 1.0 // 1 second press
longPressGesture.delegate = self
self.tableView.addGestureRecognizer(longPressGesture)
对我来说,通过对选择器使用以下语法解决了这个问题:
action: #selector(MyViewController.handleLongPress)
我尝试了以下替代方案,但没有任何运气。 这些都不行:
action: #selector(self.handleLongPress)
action: #selector(MyViewController.handleLongPress(_:))
action: #selector(self.handleLongPress(_:))
action: #selector("handleLongPress(_:)")
此外,即使我似乎没有将任何参数传递给 MyViewController.handleLongPress
,选定的行在长按选择时打印到控制台也很好:
Long press on row, at 5