Objective-c Разрыв строки через каждые 10 символов (держать слова в такте) - PullRequest
3 голосов
/ 29 февраля 2012

Если у меня есть строка, которую я собираюсь загрузить в TextField, как я могу сделать разрыв строки \ n через каждые 10 символов (включая пробелы и еще много чего), но не переходить на середину следующей строки ... Какобернуть текст не более 10 символов?Но я не просто заключаю в UITextField, мне действительно нужно ввести \ n, потому что он будет использоваться и во что-то еще ... (Это для iOS, если это имеет значение) любая помощь приветствуется, я действительно застрял!

Ответы [ 4 ]

5 голосов
/ 29 февраля 2012

Возможно, вы захотите использовать 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];
}
2 голосов
/ 29 февраля 2012

Я создал что-то, что на самом деле делает разрывы, не на каждые 10 символов, а между словами, там нет механизма переноса слов, который потребовал бы словарь.Я построил это из ответа Восприятия.

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--;
}
1 голос
/ 29 февраля 2012

Я бы сделал это примерно так:

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 голосов
/ 29 февраля 2012

Вам придется самостоятельно вставлять символы новой строки в строку, для этого нет встроенной функции.

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);
...