2017-07-27 1 views
-1

Je veux que le code s'exécute une fois par jour, mais la façon dont je veux accomplir cela est de désactiver le bouton après avoir cliqué dessus, puis de le réactiver lorsqu'il a duré plus de 24 heures.Comment enregistrer la date à laquelle l'utilisateur appuie sur un bouton dans swift?

Le code ci-dessous est-il correct pour enregistrer la date à laquelle l'utilisateur a appuyé sur le bouton?

if distance < radius{ 
    Total_Points += 10 
    pointsLabel.text = "Total Points: \(Total_Points)" 

    getPointsOutlet.isEnabled = false 

    let clickdate = UserDefaults.standard 

    if var timeList = clickdate.object(forKey: "timeList") as? [Date]{ 
     timeList.append(Date()) 
     clickdate.set(timeList, forKey: "timeList") 
    } else { 
     clickdate.set([Date()], forKey: "timeList") 
    } 
    clickdate.synchronize() 
} 


let PointsDefault = UserDefaults.standard 
PointsDefault.setValue(Total_Points, forKey: "Total Points") 
+0

Vous n'avez pas besoin de créer une nouvelle variable chaque fois que vous appelez 'UserDefaults.standard', vous pouvez l'utiliser tel quel (par exemple' UserDefaults.standard.setValue (...) 'ou le définir en une seule fois et le réutiliser (par exemple 'let defaults = UserDefaults.standard' et plus tard' defaults.setValue (...) ' – Paolo

+0

Merci, je vais changer cela, mais qu'en est-il de sauver la date à laquelle l'utilisateur appuie sur le bouton? –

Répondre

0

Vous pouvez obtenir de cette façon lorsque vous avez appuyé sur le bouton enregistrer la valeur de date à l'aide Userdefaults puis à l'intérieur de votre ViewDidAppear, viewDidLoad et UIApplicationWillEnterForeground méthode de notification a mis le chèque pour obtenir dateValue de paramètres utilisateur par défaut, puis prendre la différence date actuelle et dernière date de stockage et, par conséquent, activé votre bouton.

lazy var userDefaults: UserDefaults = { 
     return UserDefaults.standard 
    }() 
func ViewDidLoad() { 
    UserDefaults.set(Date(), forKey:"date") 
    userDefaults.synchronize() 
} 

func someMethodWhereYouWantToGetValue() { 
guard let value = userDefaults.object(forKey: "date") as? Date else 
{return} 
print(value) 
} 
+0

Merci, mais comment puis-je enregistrer la date? Je l'ai essayé dans mon code ci-dessus mais je ne suis pas sûr si c'est correct –

+0

Essayez ceci: - laissez def = UserDefaults.standard \t \t def.set (NSDate(), forKey: " date ») \t \t impression (def.object (forKey:" date ")) –

+0

Cela a fonctionné, mais je reçois une guerre ning pour la ligne d'impression disant "expression implicitement contrainte de 'Any?' à Any '" –

0

Votre code

let clickdate = UserDefaults.standard 

if var timeList = clickdate.object(forKey: "timeList") as? [Date]{ 
    timeList.append(Date()) 
    clickdate.set(timeList, forKey: "timeList") 
} else { 
    clickdate.set([Date()], forKey: "timeList") 
} 
clickdate.synchronize() 

est très bien pour ajouter une date à un tableau des dates enregistrées. Vous pouvez tirer que sortir dans une fonction distincte:

func addDateToDefaults(date: Date? = nil) { 
    let defaults = UserDefaults.standard 

    if date = nil { 
     date = Date() 
    } 

    if var timeList = defaults.object(forKey: "timeList") as? [Date]{ 
     timeList.append(date) 
     defaults.set(timeList, forKey: "timeList") 
    } else { 
     defaults.set([date!], forKey: "timeList") 
    } 
} 

Ensuite, vous pouvez appeler à partir d'une action de bouton:

@IBAction func buttonClicked(_ sender: UIButton) { 
    addDateToDefaults() 
    //The rest of your button action code goes here 
} 

Avec la fonction addDateToDefaults() ci-dessus, vous pouvez passer à une date précise, ou à laisser désactiver le paramètre de date et il ajoutera la date actuelle à votre tableau de dates.