开发者

stringByReplacingCharactersInRange don't replace It's Append !

I Spent 5 hours try to figure a way for that..i'm trying to do a hangman app for iphone and the method below 开发者_如何学Gois the method that should be called when the player chooses a character and it match the chosen word..

-(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;

}

the problem is stringByReplacingCharactersInRange doesn't replace the character, it appends it to the underscore what am I doing wrong here?

Best Regards, M Hegab


Just played around with your code. It does not work, but stringByReplacingCharactersInRange is not your problem.
Your game logic doesn't work like it should. Get a pen and a sheet of paper and "manually" loop through your for loop to see that this must be wrong.
Next time, if you've stared at code for half an hour, take a pen. This will save you at least 4 hours :-)

There are some issues with your code. Assume Kartoffelkäfer is the word you are looking for, and the user enters the letter 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;    
}

I assumed that the content of hiddenText.text is @"______" and the content of fullText.text is @"Kartoffelkäfer". So hiddentext is the exact length as the fullText.
What I had to change to get this to work:

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;

Far away from good code, but I tried to change your code as little as possible.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜