2010-07-04 5 views
-3

Quelque chose ne va pas avec mon code ici et je ne peux pas tout à fait le comprendre.Quel est le problème avec mon Objective-C?

Modifier: Veuillez corriger ce code. Merci!

int stringLength = [theData length]; 
for (int i = 1; i <= stringLength; i++) { 
     unichar currentCharacter = [theData characterAtIndex:i]; 
     int currentCharacterCode = keyCodeForKeyString(currentCharacter); 
     CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)currentCharacterCode, true); 
     CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)currentCharacterCode, false); 
} 

- (int)keyCodeForKeyString:(unichar)keyString 
{ 
    if (strcmp(keyString, "a") == 0) return 0; 
    if (strcmp(keyString, "s") == 0) return 1; 
    if (strcmp(keyString, "d") == 0) return 2; 
    if (strcmp(keyString, "f") == 0) return 3; 
    if (strcmp(keyString, "h") == 0) return 4; 
} 
+1

quel est le problème? Quelle est l'erreur? qu'est-ce que c'est censé faire? Nous ne pensons pas aux lecteurs .... –

+0

il est supposé exécuter 'CGPostKeyboardEvent' (qui simule une pression de touche dans le cacao) à partir d'une chaîne de caractères. Il est supposé scinder la chaîne dans la boucle for, trouver le code de clé correct, puis placer ce code clé dans 'CGPostKeyboardEvent'. Xcode dit 'Initialisation fait un pointeur à partir d'un entier sans un cast',' No '-keyCodeForKeyString' méthode found'. –

+2

Il ne fonctionne que sur OSX, c'est le problème! –

Répondre

3

D'une part, characterAtIndex est indexé par zéro. Donc, vous commencez par le deuxième caractère de la Data, et (en supposant que theData et theString ont la même longueur) en lisant un après la fin (ce qui est un comportement indéfini). Pour un autre, characterAtIndex renvoie unichar, pas un pointeur sur char. Vous appelez également keyCodeForKeyString sur le pointeur lorsque vous devez le passer en paramètre. Mais vous pouvez modifier keyCodeForKeyString pour prendre unichar, plutôt qu'une chaîne terminée par un caractère null.

+0

ah merci, j'ai pensé que [longueur NSString] a commencé à 1, mais je ne savais pas que characterAtIndex a commencé à 0. merci. qu'est-ce qu'unichar et que dois-je faire? –

+0

Un 'unichar' représente une unité de code Unicode. En interne, c'est un court métrage non signé. '[NSString length]' ne * commence * pas * à 1. Il peut être zéro, ce qui signifie que la chaîne est vide (et que vous ne pouvez pas appeler characterAtIndex). Rappelez-vous également que l'indexation zéro implique que le dernier caractère est la longueur - 1. –

+0

Je déteste avoir l'air agaçant, mais pourriez-vous s'il vous plaît corriger le code? Je ne vais nulle part. J'apprendrais en voyant ce qui est correct. Voici ce que j'ai ... 'for (int i = 1; i <= StringLength; i ++) { \t \t \t unichar currentCharacter = [theData characterAtIndex: i]; \t \t \t int currentCharacterCode = cléCodeForKeyString (currentCharacter); \t \t \t CGPostKeyboardEvent ((CGCharCode) 0, (CGKeyCode) currentCharacterCode, true); \t} - (entier) keyCodeForKeyString: (unichar) keyString { if (strcmp (chaîne_clé, "a") == 0) return 0; \t if (strcmp (chaîne_clé, "s") == 0) renvoie 1; ' ... ... ' Je ne sais pas pourquoi il ne formatera pas pour le code ... –

3

Cette ligne:

int currentCharacterCode = keyCodeForKeyString(currentCharacter); 

est un problème. Vous ne semblez pas avoir une fonction appelée keyCodeForKeyString. Vous avez une méthode avec ce nom, mais la syntaxe pour ce serait

int currentCharacterCode = [self keyCodeForKeyString: currentCharacter]; 
//       ^^^^ I assume you are sending the message from the same object. 
Questions connexes