2017-09-20 1 views
0

j'ai un jeu et Im essayant de le garder petit et dans mon jeu que j'ai cette fonctionSet Les valeurs de UserDefaults multiples avec fonction unique Swift 3

func deductCoins() -> Bool { 

    if price > coins { 
     label.text = String("You dont have enough coins") 
     self.view.addSubview(label) 
     return false 
    } 
    if coins >= price { 
     coins = coins - price 
     UserDefaults.standard.set(coins, forKey: "Coins") 
     BackBtn.removeFromSuperview() 
     PurchaseBtn.removeFromSuperview() 
     label.removeFromSuperview() 
     image.removeFromSuperview() 
     return true 
    } 

    return true 
} 

cette fonction est utilisée pour acheter du contenu dans le jeu est là une façon de passer d'un paramètre ou une méthode pour modifier différents UserDefaultBoolean valeurs true basée sur une variable par exemple dans psuedo code

func deductCoins() -> Bool { 
    if price is greater than coins { 

     tell the user that he/she doesnt have enough coins 
    } 
    if coins is greater than coins { 
     tell the user he/she has bought the item 
     change a UserDefault Boolean value 
     if a value is different based on a parameter 
     change a different value because of it 
    } 
} 

Je ne suis pas bon à l'écriture des fonctions complexes et à long je l'ai utilisé cette fonction pour ne déverrouiller un élément dans un ViewController mais maintenant je suis en utilisant des cellules CollectionView avec différents éléments en eux et je veux déverrouiller un contenu différent en fonction de ce que l'utilisateur en utilisant une seule cueillies à la fonction

-update 1 -

ici est ce que je suis venu avec son certainement pas la meilleure méthode, mais il fonctionne

//this Int value is set in the Index method in my collectionView 
var Int = 0 

func deductCoins() -> Bool { 

    if price > coins { 
     label.text = String("You dont have enough coins") 
     self.view.addSubview(label) 
     return false 
    } 
    if coins >= price { 
     if Int == 1 { 
      coins = coins - price 
      UserDefaults.standard.set(coins, forKey: "Coins") 
      BackBtn.removeFromSuperview() 
      PurchaseBtn.removeFromSuperview() 
      label.removeFromSuperview() 
      image.removeFromSuperview() 
      UserDefaults().set(true, forKey: "ItemUnlocked") 
      return true 
     } 
     if Int == 2 { 
      coins = coins - price 
      UserDefaults.standard.set(coins, forKey: "Coins") 
      BackBtn.removeFromSuperview() 
      PurchaseBtn.removeFromSuperview() 
      label.removeFromSuperview() 
      image.removeFromSuperview() 
      UserDefaults().set(true, forKey: "ItemUnlocked") 
      return true 
     } 
     if Int == 3 { 
      coins = coins - price 
      UserDefaults.standard.set(coins, forKey: "Coins") 
      BackBtn.removeFromSuperview() 
      PurchaseBtn.removeFromSuperview() 
      label.removeFromSuperview() 
      image.removeFromSuperview() 
      UserDefaults().set(true, forKey: "ItemUnlocked") 
      return true 
     } 
     if Int == 4 { 
      coins = coins - price 
      UserDefaults.standard.set(coins, forKey: "Coins") 
      BackBtn.removeFromSuperview() 
      PurchaseBtn.removeFromSuperview() 
      label.removeFromSuperview() 
      image.removeFromSuperview() 
      UserDefaults().set(true, forKey: "ItemUnlocked") 
      return true 
     } 
     if Int == 5 { 
      coins = coins - price 
      UserDefaults.standard.set(coins, forKey: "Coins") 
      BackBtn.removeFromSuperview() 
      PurchaseBtn.removeFromSuperview() 
      label.removeFromSuperview() 
      image.removeFromSuperview() 
      return true 
     } 
    } 

    return true 
} 

et est ici la méthode du chemin d'index

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    // handle tap events 
    if indexPath.item == 0 { 
     //the first item in my Index path is free it cost nothing 
     //other things happen here i didnt post on purpose to keep some privacy 
    } 
    if indexPath.item == 1 { 
     Int = 1 
     //other things happen here i didnt post on purpose to keep some privacy 
    } 
    if indexPath.item == 2 { 
     Int = 2 
     //other things happen here i didnt post on purpose to keep some privacy 

    } 
    if indexPath.item == 3 { 
     Int = 3 
     //other things happen here i didnt post on purpose to keep some privacy 

    } 
    if indexPath.item == 4 { 
     Int = 4 
     //other things happen here i didnt post on purpose to keep some privacy 

    } 
    if indexPath.item == 5 { 
     Int = 5 
     //other things happen here i didnt post on purpose to keep some privacy 
    } 
} 

et c'est ce que je suis venu avec et il fonctionne comme je l'ai besoin aussi si les gars vous avez d'autres meilleures méthodes s'il vous plaît me frapper avec un anwser et vérifier malade dehors

+0

Conserver les booléens d'achat d'applications dans les valeurs par défaut est une grande vulnérabilité. Les valeurs par défaut de l'utilisateur peuvent être modifiées facilement sans votre consentement. – Desdenova

+0

non pas de contenu dans le jeu acheté avec des pièces de jeu im im pas assez stupide pour utiliser UserDefaults pour les achats in-app (parce que je l'habitude de pirater des jeux comme ça) –

Répondre

0

Si je comprends bien, je En supposant que vous aurez une liste d'éléments dans le jeu et lorsque l'utilisateur achètera chaque objet, vous devez définir le drapeau de l'objet d'achat comme vrai et réduire le nombre de pièces de monnaie du total des pièces.

Et je suis aussi en supposant que vous avez les données de jeu comme

let gameList = [["level":"1", "name":"Saga","itemId":"10001","coinsRequired":10], 
       ["level":"2", "name":"Rita","itemId":"10002","coinsRequired":20], 
       ["level":"3", "name":"Villa","itemId":"10003","coinsRequired":10], 
       ["level":"4", "name":"Corn","itemId":"10004","coinsRequired":5], 
       ["level":"5", "name":"Leavy","itemId":"10005","coinsRequired":34], 
       ["level":"6", "name":"Uhoo","itemId":"10006","coinsRequired":12]] 

et vous pouvez maintenant mettre en œuvre votre achat de jeu

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 

    let gameItem = gameList[indexPath.row] 
    cell?.textLabel?.text = gameItem["name"] as? String 

    let button = UIButton(type: .custom) 
    button.frame = CGRect(x: 0, y: 0, width: 60, height: 40) 
    let gameStatus = UserDefaults.value(forKey: "ItemUnlocked\(gameItem["itemId"] as! Int)") as! Bool 
    if gameStatus == true{ 
     // play the game 
     button.titleLabel?.text = "Play" 
    }else{ 
     // buy the item 
     button.titleLabel?.text = "Buy\n $\(String(describing: gameItem["coinsRequired"]!))" 
    } 
    button.titleLabel?.numberOfLines = 0 
    button.tag = indexPath.row 
    button.addTarget(self, action: #selector(buyItemButtonTapped(_:)), for: .touchUpInside) 
    cell?.accessoryView = button 
    return cell! 
} 


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return gameList.count 
} 


func buyItemButtonTapped(_ aButton: UIButton){ 
    let gameItem = gameList[aButton.tag] 
    buyIyem(itemId: gameItem["itemId"] as! Int) 
} 


@discardableResult 
func buyIyem(itemId aItemId: Int) -> Bool { 
    let price = gameList[aItemId]["price"] as! Int 
    var totalCoins = UserDefaults.standard.integer(forKey: "TOTAL_COINS") 
    if price > totalCoins { 
     // SHow "You dont have enough coins". 
     return false 
    } 
    if totalCoins >= price { 
     totalCoins = totalCoins - price 
     UserDefaults.standard.set(totalCoins, forKey: "TOTAL_COINS") 
     // handle the UI here 
     UserDefaults().set(true, forKey: "ItemUnlocked\(aItemId)") 
     return true 
    } 
    return true 
} 

J'espère que cela vous aide dans votre implémentation