2012-02-28 53 views
3

如果我有一個字符串,我將加載到TextField中如何進行換行\ n每10個字符出現一次(包括空格和whatnot)但不能去中間詞的下一行......就像用最多10個字符來包裝文本一樣?但我不只是包裝在UITextField中,實際上我需要\ n的輸入,因爲它會用在別的東西上......(這對於iOS來說很重要)任何幫助都會被讚賞我真的被卡住了!Objective-c行間隔每10個字符(保持文字的完整)

回答

4

你可能想利用NSScanner的循環放在一起這樣的事情,而是要找出精確的算法你需要準確地闡明你怎麼想它的工作。下面是你需要回答的問題:

    字與字之間不止一個空白的
  1. 是否應序列「坍塌」成一個單一的空白的文本換行的目的,還是應該連續5個空格的序列來計算作爲5個字符反對你每行10個字符?我會假設你想要多個空間被摺疊而不是保留
  2. 如果你有一個單詞大於10個字符,你希望它工作嗎?你是否希望它最後有一個大於10個字符的行,或者你希望插入換行符並在該情況下強制中間字符行中斷?我會假設你想讓超過10個字符的單詞超出10個字符的限制。

擁有約記住您的問題這些假設,我想這樣的代碼是:

NSMutableString *resultString = [[NSMutableString alloc] init]; 
NSMutableString *currentLine = [[NSMutableString alloc] init]; 
NSScanner *scanner = [NSScanner scannerWithString:sourceString]; 
NSString *scannedString = nil; 
while ([scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString: &scannedString]) { 
    if ([currentLine length] + [scannedString length] <= 10) { 
     [currentLine appendFormat:@"%@ ", scannedString]; 
    } 
    else if ([currentLine length] == 0) { // Newline but next word > 10 
     [resultString appendFormat:@"%@\n", scannedString]; 
    } 
    else { // Need to break line and start new one 
     [resultString appendFormat:@"%@\n", currentLine]; 
     [currentLine setString:[NSString stringWithFormat:@"%@ ", scannedString]]; 
    } 
    [scanner scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL]; 
} 
+0

這有效奇蹟!非常感謝!!! :) – 2012-02-29 00:21:50

+0

我希望我能給雙倍upvotes這個。作爲IOS界新人,本來可能花了我一整天的時間來寫這篇文章,或許更多。 – Caimen 2012-11-13 19:08:26

0

你必須自己插入換行符到你的字符串中,這個afaik沒有內置函數。

NSMutableString * guid = [NSMutableString stringWithString: @"Some suitably long string will be used for demonstration purposes"]; 
for(NSUInteger i = 10; i < [guid length] ; i += 10) { 
    [guid insertString:@"\n" atIndex: i]; 
} 

NSLog(@"GUID: %@", guid); 
+0

這並不詞之間加休息。 – nycynik 2012-02-28 22:49:18

+0

啊,錯過了那部分標題。 – Perception 2012-02-29 00:38:58

1

我願意做它的方式類似的東西一:

NSString *finalString = @""; 
NSString *yourString = @"This is your very very long string with many words and letters and spaces, haha"; 
NSArray *someArray = [yourString componentsSeparatedByString:@" "]; //that will make an array with strings separated by spaces 
for (int i = 0; i < [someArray count]; i++) { 
    NSArray *someArray2 = [finalString componentsSeparatedByString:@"\n"]; 
    if ([[someArray objectAtIndex:i]length] + [[someArray2 lastObject]length] > 9) 
    finalString = [NSString stringWithFormat:@"%@\n%@", finalString, [someArray objectAtIndex:i]]; 
    else 
    finalString = [NSString stringWithFormat:@"%@ %@", finalString, [someArray objectAtIndex:i]]; 
} 

我相信,這樣的事情應該工作。我附近沒有一臺Mac,所以我用我的記憶寫下了這些(這並不總是完美無瑕)。所以代碼中可能會有一些錯誤。

希望它可以幫助

+0

這是偉大的,但沒有任何案件的話長於10個字符 – nycynik 2012-02-28 22:49:34

2

我創造的東西,實際上沒有休息時間,而不是在每10個字符,但字與字之間,而不是有沒有斷字引擎存在,就需要一個字典,。我從Perceptions的答案構建它。

NSMutableString * guid = [NSMutableString stringWithString: @"Some suitably long string will be used for demonstration purposes"]; 
int lastSpace=0; 
int lastbreak=0; 
NSUInteger i = [guid length]; 
while(i > 0) { 
    if ([guid characterAtIndex:i-1]==' ') 
     lastSpace=i; 
    lastbreak++; 
    if (lastbreak>9) { 
     if (lastSpace!=0) { 
      [guid insertString:@"\n" atIndex: lastSpace]; 
     } else { 
      // we have not found a space in 10 chars, so break where there is no space. 
      // no H&J engine here, so we can add the - or not. 
      [guid insertString:@"-\n" atIndex: i]; 
      i++; // since were adding a character, dont skip a character. 
     } 
     lastbreak=0; 
     lastSpace=0; 
    } 
    i--; 
} 
+0

很容易遵循! lastSpace變量!爲什麼我沒有想到;)謝謝! – 2012-02-29 00:05:38

+0

等一下對不起,這個不行,就像我認爲的那樣,它會允許一行以上的10個以上的字符。我需要10作爲最大值。它需要更頻繁地換行 – 2012-02-29 00:07:43

+0

隨着一些調整,我得到了它的工作(從頭開始計算「i」變量,並在空格結束時強制空格,而不是在下一個單詞結束時結束)謝謝! – 2012-02-29 00:18:59

相關問題