2012-02-28 1 views
3

Если у меня есть строка, которую я собираюсь загрузить в TextField, как я могу сделать разрыв строки \ n, появятся каждые 10 символов (включая пробелы и еще много чего) но не переходите к следующей строке в середине слова ... Как обернуть текст максимум 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

Это сработало чудеса! Огромное спасибо!!! :) –

+0

Хотелось бы, чтобы я мог дать двойные бонусы для этого.Будучи кем-то новым в мире IOS, мне потребовался целый день, чтобы написать это, может быть, больше. – Caimen

0

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

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

+0

Ах, пропустил эту часть названия. – Perception

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

2

я создал что-то, что на самом деле делает перерывы, а не на каждых 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--; 
} 
+0

Очень легко следить! Последняя переменная! Почему я не подумал об этом;) Спасибо! –

+0

Ждите, извините, что это не работает, как я думал, он сделал, это позволит более 10 символов на линии. Мне нужно 10 максимум. Это нужно, чтобы линия ломать чаще –

+0

С некоторой настройкой я получил ее работу (считая переменную «i» с самого начала и заставляя перерывы в пространствах, когда она перешла через 10, а не после следующего слова, когда она перейдет) Спасибо! –