Вы спите в главном потоке, поэтому пользовательский интерфейс не обновляется до конца сна.
Вам необходимо реализовать что-то вроде следующего:
// This code is in your view controller somewhere, where you initially decide to update the label. typedWord is the outlet to your UILabel.
NSString *newText = @"Hello";
typedWord.text = @"";
[self performSelector:@selector(updateLabel:) withObject:newText afterDelay:0.2];
Это вызывает:
// This is a separate method in your view controller, so typedWord still refers to the label outlet.
-(void)updateLabel:(NSString*)newText
{
// Get the first character of the passed in string
NSString *firstCharacter = [newText substringToIndex:1];
// Add this to whatever the current label text is
typedWord.text = [NSString stringWithFormat:@"%@%@",typedWord.text,firstCharacter];
// Trim off the first character
NSString *remainingCharacters = [newText stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:@""];
//If we still have characters left, do the loop again.
if (![remainingCharacters isEqualToString:@""])
[self performSelector:@selector(updateLabel:) withObject:remainingCharacters afterDelay:0.2];
}