将目标添加到UIButton中进行超级视图

问题描述:

我正在以编程方式将UIView添加到SKScene。在这个UIView我有一个按钮应该在SKScene中激发一个命令。我该怎么做呢?我的代码抛出一个异常。或者,这可能只是不干净的编程?将目标添加到UIButton中进行超级视图

class LevelAchievedView: UIView { 

override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.opaque = false 
    } 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func drawRect(rect: CGRect) { 
     let replayButton = UIButton() 
     replayButton.setTitle("Replay?", forState: UIControlState.Normal) 
     replayButton.setTitleColor(UIColor.greenColor(), forState: UIControlState.Normal) 
     replayButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 30) 
     replayButton.addTarget(self.superview, action: "returnToStart", forControlEvents: .TouchUpInside) 
     replayButton.frame.origin = CGPointMake(10, 10) 
     self.addSubview(replayButton) 
    } 

看来我搞乱replayButton.addTarget(self.superview...,我想我不能使用self.superview在这种情况下,虽然我已经在SKScene的func returnToStart()。我错过了什么?

引发的异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SKView returnToStart]: unrecognized selector sent to instance 0x7ff10980fc00' 
+0

我想你已经在你的'SKScene'类中创建了'returnToStart'。但'self.superview'不是'SKScene',只是因为'SKScene'不是'UIView'的子类。你的代码尝试在由'didMoveToView(view:UIView)'接收到的'UIView'上执行'returnToStart'。也不是'returnToStart'!='returnToStart:'。 – Sony

+0

是的,我在我的SKScene类中创建了returnToStart。我可以从UIView访问SKScene函数吗? – Pete

+0

我发布了一个解决方案。 – Sony

self.superview不是SKScene。只是一个解决方案:

class LevelAchievedView: UIView { 
    let replayButton: UIButton 

    override init(frame: CGRect) { 
     self.replayButton = UIButton() 

     super.init(frame: frame) 
     self.opaque = false 

     replayButton.setTitle("Replay?", forState: UIControlState.Normal) 
     replayButton.setTitleColor(UIColor.greenColor(), forState: UIControlState.Normal) 
     replayButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 30) 
     replayButton.frame.origin = CGPointMake(10, 10) 
     self.addSubview(replayButton) 
    } 
} 

class MyScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     // ... 
     let levelAchieved = LevelAchievedView(rect: CGRect(...)) 
     levelAchieved.replayButton.addTarget(self, action: "returnToStart", forControlEvents: .TouchUpInside) 
     view.addSubview(levelAchieved) 
    } 

    func returnToStart() { 
     // your code here 
    } 
} 
+0

当我使用此代码时,我收到消息:属性'self.replayButton'未在super.init调用时初始化。 – Pete

+0

我更新了我的代码。但我认为你能解决这个问题。请不要复制粘贴... – Sony

+0

我将第二行更改为'let replayButton = UIButton()'并删除了'self.replayButton = UIButton'。现在完美运作,谢谢! – Pete

您需要实现returnToStart。尝试添加这样的事情:

function returnToStart() { 
    println("returning to start"); 
} 

LevelAchevedView

+0

当我这样做时,我无法更改包含UIView LevelAchievedView类的SKView。所以它不适合我。 – Pete