Je suis un débutant iOS. J'ai une méthode de sélection comme suit -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
J'essaye de mettre en œuvre quelque chose comme ça -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Mais cela me donne une erreur en disant -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Des idées sur ce qui me manque?
invoke
appeler:[inv performSelector:@selector(invoke) withObject:nil afterDelay:1];
je dois convenir que c'est une excellente solution. Bon codage à tous!Parce qu'il n'y a pas de
[NSObject performSelector:withObject:withObject:afterDelay:]
méthode.Vous devez encapsuler les données que vous souhaitez envoyer dans un objet Objective C unique (par exemple un NSArray, un NSDictionary, un type Objective C personnalisé), puis les transmettre via la
[NSObject performSelector:withObject:afterDelay:]
méthode bien connue et appréciée.Par exemple:
la source
NSNumber * whatToDoNumber = [NSNumber numberWithBool: doThis];
") et passez-le en tant que paramètre unique, @virata.Vous pouvez regrouper vos paramètres dans un seul objet et utiliser une méthode d'assistance pour appeler votre méthode d'origine comme Michael et d'autres l'ont suggéré.
Une autre option est dispatch_after, qui prendra un bloc et le mettra en file d'attente à un certain moment.
Ou, comme vous l'avez déjà découvert, si vous n'avez pas besoin du délai, vous pouvez simplement utiliser
- performSelector:withObject:withObject:
la source
__weak
pour donner à votre prétendu minuteur seulement un lien faible vers soi-même - de sorte que vous ne finissez pas par prolonger artificiellement le cycle de vie de votre objet et par exemple si votre performSelector: afterDelay: effectue quelque chose d'un peu comme tail récursivité (bien que sans la récursivité) puis il résout le cycle de rétention.L'option la plus simple consiste à modifier votre méthode pour prendre un seul paramètre contenant les deux arguments, comme un
NSArray
ouNSDictionary
(ou ajouter une deuxième méthode qui prend un seul paramètre, le décompresse et appelle la première méthode, puis appelez la deuxième méthode sur un retard).Par exemple, vous pourriez avoir quelque chose comme:
Et puis pour l'appeler, vous pouvez faire:
la source
NSDictionary
perd également la sécurité du type. Pas idéal.performSelector:
(ouNSInvocation
). Si c'est un problème, la meilleure option serait probablement de passer par GCD.et appelez-le avec:
la source
Vous pouvez trouver tous les types de méthodes performSelector: fournies ici:
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html
Il existe de nombreuses variantes, mais il n'y a pas de version qui accepte plusieurs objets ainsi qu'un retard. Vous devrez à la place encapsuler vos arguments dans un NSArray ou NSDictionary.
la source
Je n'aime pas la méthode NSInvocation, trop complexe. Gardons les choses simples et propres:
la source
J'ai juste fait quelques swizzling et ai dû appeler la méthode originale. Ce que j'ai fait, c'est de faire un protocole et de m'y opposer. Une autre façon est de définir la méthode dans une catégorie, mais nécessiterait la suppression d'un avertissement (#pragma clang diagnostic ignoré "-Wincomplete-implementation").
la source
Un moyen simple et réutilisable est d'étendre
NSObject
et de mettre en œuvrequelque chose comme:
la source
Je créerais simplement un objet personnalisé contenant tous mes paramètres en tant que propriétés, puis utiliserais cet objet unique comme paramètre
la source