Свойство UITextView.text не обновляется в первый раз, а затем обрезается или не отображается при этом - PullRequest
0 голосов
/ 20 июля 2010

Я пытаюсь получить содержимое из словаря в UITextView.Словарь содержит молекулярные массы в паре с процентами, например:

24 -> 98
25 -> 1.9
26 -> 0.1

У меня есть NSArray, содержащий ключи из словаря, отсортированные в порядке возрастания.Итак, вот мой код для генерации строки для установки в качестве свойства textField.text:

-(void)detailIsotopes:(NSMutableDictionary *)isotopes withOrder:(NSMutableArray *)order{
NSMutableString *detailString = [[NSMutableString alloc] init];

for (NSNumber *mass in order){
    [detailString appendString:[NSString stringWithFormat:@"%d: %f\n", [mass integerValue], [[isotopes valueForKey:[NSString stringWithFormat:@"%@", mass]] floatValue]]];
}

NSLog(@"%@", detailString);
textField.text = detailString;
[detailString release];
}

Это должно создать строку, выглядящую так:

24: 89
25: 1.9
26: 0.1

По некоторым причинам,этот метод никогда ничего не делает при первом запуске.Я вижу вывод NSLog, который выводит правильную строку.Тем не менее, содержимое UITextView не меняется: они остаются как «Lorem ipsum dolor sit amet ...» от Interface Builder.Если я снова запустил метод, он работает, вроде.

UITextView отображает часть текста, а затем просто обрезает половину строки, оставляя только верхние части символов.Если я удаляю содержимое над половиной строки, остальные строки вытягиваются из-под границы: содержимое есть, оно просто перестает отображаться, если вы понимаете, о чем я.Это, кажется, уходит, если я включаю подкачку в представлении.Если я это сделаю, то строка не будет усечена, но UITextView просто перестает показывать какой-либо контент после некоторой точки, хотя полоса прокрутки указывает, что есть еще что (что есть).

Представлениесодержащий UITextView не виден, когда установлено содержимое, если это имеет значение.Отдельный контроллер представления генерирует NSMutableDictionary и NSMutableArray и отправляет их своему делегату, который затем отправляет их представлению, которое должно отображать UITextField, и имеет detailIsotopes: withOrder: метод.Их можно поменять местами с помощью информационной кнопки.

Кто-нибудь понимает, почему это происходит?Спасибо за любой совет, который вы можете дать!

1 Ответ

1 голос
/ 21 июля 2010

Прежде всего, я не думаю, что вам нужно выделять и выпускать вашу NSMutableString здесь. Просто инициализируйте один, используя [NSMutableString string], который создает пустую строку, которую вы можете изменить, и не нужно явно освобождать.

Во-вторых, вы, кажется, храните массы в NSStrings в вашем NSDictionnary, почему вы используете их метод integerValue для stringWithFormat (с модификатором %d) вместо того, чтобы использовать их как есть? (модификатор stringWithFormat для строк NSStrings %@)

Кроме того, вы говорите о UITextView при запуске, а затем о UITextField, вы уверены, что не ошиблись где-то? Я предполагаю, что получающий объект для вашей отформатированной строки NSString должен быть UITextView (если у вас есть и textField, и textView).

Если дело не в этом, возможно, вы звоните detailIsotopes слишком рано, и текстовое представление уже создано. Попробуйте NSLog его адрес и посмотреть, если это nil в первый раз. Это может быть в том случае, если вы используете Interface Builder, а ваш UITextField является ib outlet. Если вы это сделаете, то вы можете сохранить свой словарь и массив в viewController и установить textField в методе viewController viewDidLoad. Или позвоните detailIsotopes после того, как вы отобразите вид, я думаю, это ваше дело.

Что касается усеченного текста, я думаю, что это потому, что UITextView не изменяет свой размер автоматически, поэтому он сохраняет высоту, которую вы изначально установили. Что я обычно делаю, это:

CGRect frame = textView.frame;
frame.size.height = textView.contentSize; // you can adjust this to leave some space at the end
textView.frame = frame;

Это установит высоту textView равной высоте содержимого (текста). Также обратите внимание, что если ваш textView должен отображать весь текст, вы можете установить его свойство scrollingEnabled равным FALSE, чтобы оно никогда не разрешало прокрутку.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...