2010-11-06 6 views
0

J'ai dépensé 5 heures essayer de trouver un moyen pour cela .. j'essaie de faire une application de pendu pour iphone et la méthode ci-dessous est la méthode qui devrait être appelée lorsque le joueur choisit un personnage et qu'il correspond au mot choisi. .stringByReplacingCharactersInRange ne remplace pas C'est Append!

-(void)replaceTheHiddenTextWithNewText:(NSString*)character{ 
NSString *fullTextField = fullText.text; 
int textCount = [hiddenText.text length]; 

NSString *theRiddle; 
for (int i = textCount-1 ; i>=0; i--) { 

    NSString *hiddenTextField = [[NSMutableString alloc] initWithString:hiddenText.text]; 
    NSString *aChar=[fullTextField substringWithRange:NSMakeRange(i/3,1)]; 

    if ([aChar isEqualToString:@" "]) { 

     theRiddle= [hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@" "]; 
    }else if ([aChar isEqualToString:character]) { 
     theRiddle =[hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:aChar]; 

     }else{ 
     theRiddle = [hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@"_"]; 


    } 
    hiddenTextField = theRiddle;  
} 
hiddenText.text=theRiddle; 

}

le problème est stringByReplacingCharactersInRange ne remplace pas le caractère, il ajoute au trait de soulignement ce que je fais mal ici?

Cordialement, M Hegab

Répondre

5

juste joué avec votre code. Cela ne fonctionne pas, mais stringByReplacingCharactersInRange n'est pas votre problème.
Votre logique de jeu ne fonctionne pas comme elle le devrait. Obtenez un stylo et une feuille de papier et "manuellement" en boucle dans votre boucle for pour voir que cela doit être faux.
La prochaine fois, si vous avez regardé le code pendant une demi-heure, prenez un stylo. Cela vous fera économiser au moins 4 heures :-)

Il y a quelques problèmes avec votre code. Supposons Kartoffelkäfer est le mot que vous recherchez, et l'utilisateur entre la lettre f.

for (int i = textCount-1 ; i>=0; i--) { 
    NSString *hiddenTextField = [[NSMutableString alloc] initWithString:hiddenText.text]; 
    // you are creating this string in every loop from the text of a (I guess) UITextField. 
    // I don't know what the content of this text is but I guess it is suppossed to be `______________` 
    // in every loop you replace the word where you replaced the _ with the correct letter with the string from the textfield. 
    // Btw, you are leaking this string. 

    NSString *aChar=[fullTextField substringWithRange:NSMakeRange(i/3,1)]; 
    // Kartoffelkäfer has 14 chars so i is 13. And 13/3 is 4. And the character at index 4 is o 
    // In the next loop i is 12. And 12/3 is 4, too. 
    // next three loops will give you index 3. Then you get three times index 2, and so one. 
    // you never reach the letter f, anyway. 

    if ([aChar isEqualToString:@" "]) { 
     theRiddle= [hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@" "]; 
    }else if ([aChar isEqualToString:character]) { 
     theRiddle =[hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:aChar]; 
     }else{ 
     theRiddle = [hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@"_"]; 
    // You should not replace a unmatched character with a _ . Because already matched letters would be overwritten. 

    } 
    hiddenTextField = theRiddle;  
} 

Je suppose que le contenu de hiddenText.text est @ "_ __ __ _ " et le contenu de fullText.text est @" Kartoffelkäfer". Donc, hiddentext est la longueur exacte du texte intégral.
Ce que je devais changer pour obtenir ce travail:

NSString *theRiddle; 
NSString *hiddenTextField = [[[NSMutableString alloc] initWithString:hiddenText.text] autorelease]; 
for (int i = textCount-1 ; i>=0; i--) { 
    NSString *aChar=[fullTextField substringWithRange:NSMakeRange(i,1)]; 
    if ([aChar isEqualToString:@" "]) { 
     theRiddle= [hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@" "]; 
    }else if ([aChar isEqualToString:character]) { 
     theRiddle =[hiddenTextField stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:aChar]; 
    } 
    else { 
     theRiddle = hiddenTextField; 
    } 
    hiddenTextField = theRiddle;  
} 
hiddenText.text=theRiddle; 

Loin du bon code, mais j'ai essayé de changer votre code aussi peu que possible.

+0

très bon je vais essayer cela dès que possible mais juste besoin de dire quelque chose jusqu'à ce que j'ai essayé votre code .. j'ai fait la division sur 3 pour que chaque _ a de l'espace pour que le texte caché ne soit jamais même .. c'est 3 fois .. c'est tout mais je vais essayer votre code avec un petit tweek pour cela pour mon état sauf si vous avez une meilleure idée que diviser sur 3 crabe .. merci de toute façon pour votre aide précieuse utile ça marche mais je dois dormir c'est vraiment en retard ici: D –

+0

ça marche monsieur merci beaucoup d'avoir aidé ma journée –

Questions connexes