2014-12-09 12 views
5

In meinem Programm sollen 2 Funktionen (IBAction player.Move(UIButton) und autoMove()) abwechselnd aufgerufen werden, bis alle Felder (UIButtons) angeklickt wurden. Dazu habe ich eine Funktion play() erstellt. Allerdings weiß ich nicht wie ich die IBAction playerMove innerhalb der play() Funktion setzen kann, da ich hier keinen Parameter benötige.
Ich habe einige Antworten gefunden und versucht self.playerMove(nil) und self.playerMove(self), aber es funktioniert nicht.

Aufruf von IBAction von einer anderen Methode ohne Parameter

import UIKit 

class ViewController: UIViewController { 

@IBOutlet var cardsArray: Array<UIButton> = [] 

var randomCard = 0 


override func viewDidLoad() { 
    super.viewDidLoad() 
    self.play() 
    // Do any additional setup after loading the view, typically from a nib. 
} 


func play() { 
    self.autoMove() 
    self.playerMove(self) // <----- here is my problem 

} 



@IBAction func playerMove(sender: UIButton) { 

    switch (sender) { 

    case self.cardsArray[0]: 
     self.cardPressedAll(0) 

    case self.cardsArray[1]: 
     self.cardPressedAll(1) 

    case self.cardsArray[2]: 
     self.cardPressedAll(2) 

    case self.cardsArray[3]: 
     self.cardPressedAll(3) 

    default: break 
    } 

} 


func cardPressedAll (cardNumber: Int) { 

    self.cardsArray[cardNumber].enabled = false 

    self.cardsArray[cardNumber].setBackgroundImage(UIImage(named: "cross"), forState: UIControlState.Normal) 

    self.cardsArray.removeAtIndex(cardNumber) 

} 


    func autoMove(){ 

    self.randomCard = Int(arc4random_uniform(UInt32(self.cardsArray.count))) 

    self.cardsArray[self.randomCard].enabled = false 

    self.cardsArray[self.randomCard].setBackgroundImage(UIImage(named: "nought"), forState: UIControlState.Normal) 

    self.cardsArray.removeAtIndex(self.randomCard) 
} 

} 

Antwort

8

Entweder Sie haben playerMove: ohne einen Knopf zu nennen, wobei in diesem Fall haben Sie die sender Parameter als optional zu erklären. Wie:

@IBAction func playerMove(sender: UIButton?) { 

UIButton bedeutet, dass Sie in einer Schaltfläche passieren müssen. nil ist keine Schaltfläche, aber mit UIButton?, das heißt Optional<UIButton>, nil ist ein gültiger Wert, der das Fehlen einer Schaltfläche bedeutet.

Oder müssen Sie herausfinden, welche Taste Sie an playerMove: übergeben möchten, damit es macht, was Sie wollen. Setzen Sie sich hin und erarbeiten Sie, was Sie wollen und was der Code tun muss, um dies zu ermöglichen.

+0

Leider '@IBAction func player (Sender: UIButton)' gibt mir Fehler in jedem 'case':' Wert des optionalen Typs 'UIButton?' nicht aufgewickelt; Wolltest du '!' oder "?" Beide ? und ! gib mehr Fehler;) Wenn es um ** oder ** geht: Ich weiß nicht, welchen Button ich an 'playerMove' weitergeben will, da in dieser Funktion ein Spieler einen Button auswählt. In 'autoMove()' wird zufällig eine Schaltfläche vom Computer ausgewählt. – Dandy

+0

Es klingt also so, als müssten Sie es nicht optional machen, der Code wird immer mit einer Schaltfläche umgehen, aber Sie müssen den Code in 'play' machen, um herauszufinden, welche Taste übergeben werden soll. Ich habe keine Ahnung, was du willst, also kann ich dir damit nicht helfen. Sie müssen herausfinden, was Sie wollen. – Jesper

+0

Vielen Dank für Ihre Geduld, aber ich verstehe es nicht. Durch den Aufruf von 'playerMove' will ich, dass ein Spieler ein Feld auswählt (was eine Schaltfläche ist), dann wird dieses Feld entsprechend meinem Code deaktiviert, sein Hintergrund wird sich ändern und dann wählt ein Computer zufällig ein Feld (' autoMove') und es wird auch deaktiviert und der Hintergrund wird sich ändern, dann wieder - die Bewegung des Spielers, dann die Bewegung des Computers, bis alle Felder deaktiviert sind. Wie kann ich die Funktion 'play()' anzeigen welche Taste zu übergeben? – Dandy

3

Versuchen

self.playerMove(UIButton()) 

Ihre func playerMove Parameter hat sender erwartet UIButton sein Typ, self oder nil würde ein unerwartetes Objekt sein.

Bearbeiten: Sie könnten uns optionale Parameter durch die Platzierung ?. Dadurch können Sie bei Bedarf self.playerMove(nil) anrufen.

@IBAction func playerMove(sender: UIButton?) { 
    if sender != nil { 
     //handle when button is passed 
    } else { 
     //handle when nil is passed 
    } 
} 
Verwandte Themen