2015-10-16 3 views
0

Я добавляю 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 в этом случае, хотя у меня есть func returnToStart() в SKScene. Что мне не хватает?

Исключение брошено:

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

Я думаю, что вы создали 'returnToStart' в своем классе' SKScene'. Но 'self.superview' не является' SKScene', просто потому, что 'SKScene' не является подклассом' UIView'. Ваш код попытается выполнить 'returnToStart' в' UIView', полученный 'didMoveToView (view: UIView)'. Также не то, что 'returnToStart'! =' ReturnToStart: '. – Sony

+0

Да, я создал returnToStart в классе SKScene. Могу ли я получить доступ к функциям SKScene из UIView? – Pete

+0

Я опубликовал решение. – Sony

ответ

0

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

Когда я использую этот код, я получаю сообщение: Property 'self.replayButton' не инициализируется при вызове super.init. – Pete

+0

Я обновил свой код. Но я думаю, вы смогли это исправить. Пожалуйста, не только скопировать-вставить ... – Sony

+0

Я изменил вторую строку на «let replayButton = UIButton()» и удалил «self.replayButton = UIButton». Работает отлично сейчас, спасибо миллион! – Pete

0

Вы должны реализовать returnToStart. Попробуйте добавить что-то вроде этого:

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

к вашему LevelAchevedView класса

+0

Когда я это делаю, я не могу изменить SKView, который содержит класс UIView LevelAchievedView. Так что это не работает для меня. – Pete

Смежные вопросы