12
votes

Passer deux arguments à Nstimer à Swift

J'ai une fonction contenant des chaînes de texte dans une vue textuelle. Je voudrais changer la décoloration de ce texte au fil du temps. Il ne s'agit pas de la mise en œuvre de la perte de doute, mais plutôt de la réalisation de deux arguments (la valeur alpha et de la gamme de caractères qui doivent être fanées) au sélecteur de Nstimer.

J'ai regardé Ce question, mais cela ne me fournisse pas une réponse.

C'est ce que j'ai maintenant: xxx

Cependant, il me donne un "Sélecteur" d'argument supplémentaire "" dans l'appel ". Je dois être capable de passer deux arguments, mais je ne peux pas passer une seule correctionnelle non plus; Supprimer le VAL2 de la fonction et supprimer "SAVICING", donc je ne transmett ainsi qu'un argument, entraîne la fonction d'impression de la ligne "Impression 140611230609088" à chaque étape de temps.


0 commentaires

3 Réponses :


5
votes

Tout d'abord, vous avez trop d'arguments. Deuxièmement, le FUNC reçoit un NSTIMER, vous devez donc utiliser AnyObject ou NSTIMER.

Donc, mon suggère serait donc d'utiliser un dictionnaire ou un tableau et transmettre cela comme argument userinfo comme: P>

func someFunc(){

    var timer: NSTimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("val:"), userInfo: ["key1" : 1 , "key2" : "aString"], repeats: true)     
}


func val(val : NSTimer?) {
    println("printing \(val?.userInfo)")
}


6 commentaires

Pourquoi quelqu'un va-t-il descendre ça? C'est une approche parfaitement valide.


N'a pas voté, mais la fonction de minuterie devrait prendre un argument NSTIMER (code> Func Val (TIMER: NSTIMER) .


Tu as raison. TOWOOBJECT fonctionne, mais il est plus propre d'utiliser NSTIMER, je suis d'accord.


Oui, tu as encore raison. Je suis une créature d'habitude: D


Cela semble être un moyen d'aller. Cependant, comment accéderais-je aux différentes valeurs?


Si vous utilisez un dictionnaire, vous utiliseriez val? .UserInfo? .ObjectForkey ("Key1") ou val? .uerinfo? ["Key1"]



30
votes

Créez un tableau avec vos objets et envoyez-le à userinfo. Essayez ceci: xxx

espère que cela aide .. :)


7 commentaires

Je t'ai essayé méthode et placée println (timer.userinfo? Name) dans la fonction val . Cela écrit nil chaque fois que la fonction est exécutée.


essayez d'imprimer la minuterie.userinfo


Impression TIMER.USERINFO Donne-moi ceci dans la console informatique: Facultatif (<_ TTCSSS23_CONTINGUREDRAYSTORAGE0000007FD413454E20 0X7FD413645890> (ONE, DEUX)) Comment puis-je accéder aux valeurs individuelles? Je ne peux pas utiliser Timer.userinfo [1] Par exemple, cela me donne une erreur hors limites, alors je suppose que cela ne me dirige pas vers l'index de la matrice. Affectation Ar à Timer.userInfo Produit un avertissement (non erreur) que le type inféré de arr compte est de type anyobject, qui peut être inattendu.


Pourquoi ne prenez-vous pas la minuterie.userinfo dans un tableau ??? comme arr = timer.userinfo. Ensuite, essayez d'y accéder par index ???


J'ai édité cela dans ma réponse. var arr = tempe.userinfo se comporte comme Timer.UserInfo, et je ne peux pas accéder à aucun de ses indices.


Laissez-nous Continuer cette discussion en chat .


Lorsque j'utilise les variables ("une", "deux") dans votre exemple, je travaille avec une copie des données d'origine. Cependant, je veux transmettre la chaîne de TextView et apporter des modifications au lieu d'une copie. Existe-t-il un moyen de transmettre l'adresse de la mémoire de la chaîne dans la matrice, alors je modifie la chaîne affichée?



0
votes

J'ai modifié votre code comme suit.

  1. J'ai créé un NSTIMER ! Variable qui sera attribuée dans OnefunCunc () par la méthode SchechedTimerwithTimeVal .

  2. Puis j'ai défini SELECTECTECTEUR AS TYPE STRING (Syntaxe recommandée dans SWIFT )

  3. Après cela, j'ai envoyé le userinfo qui sera récupéré à l'aide de TimerInfrimer.userinfo dans Val ()

    J'espère que cela vous aidera à résoudre votre problème. xxx

    Remarque: vous pouvez envoyer quelque chose à userinfo. Mais, bien sûr, vous devez récupérer l'utilisateurInfo en utilisant TimerInfr.UserInfo


2 commentaires

Où puis-je définir "userinfo" égal à mes deux variables, de sorte que je puisse les récupérer dans val () ?


Créez un tableau de ces deux valeurs et passez ce tableau avec UserInfo SchedulgueredTimerwithTimeVal. Vous pouvez ensuite récupérer ce tableau à l'aide de Timer.UserInfo