UITextView.text属性不会第一次更新,然后剪辑或不显示

时间:2010-07-20 14:51:58

标签: iphone objective-c uitextfield

我正在尝试将字典中的内容导入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的内容不会改变:它们仍然是Interface Builder中的'Lorem ipsum dolor sit amet ...'。如果我再次运行该方法,它可以工作,等等。

UITextView显示一些文本,然后只切断一行的一半,只留下字符的顶部。如果我删除半行以上的内容,其他行从分界线下拉:内容在那里,如果你理解我的意思,它们就会停止显示。如果我在视图中启用分页,这似乎会消失。如果我这样做,那么该行不会被截断,但是UITextView只是在某个点之后停止显示任何内容,尽管滚动条表示还有更多要去(有)。

设置内容时,包含UITextView的视图不可见,如果这有所不同。一个单独的视图控制器生成NSMutableDictionary和NSMutableArray并将它们发送到它的委托,委托然后将它们发送到应该显示UITextField并具有detailIsotopes:withOrder:方法的视图。可以使用信息按钮在两者之间交换。

有谁理解为什么会发生这些事情? 感谢您提供任何建议!

1 个答案:

答案 0 :(得分:1)

首先,我认为你不需要在这里分配和发布你的NSMutableString。只需使用[NSMutableString string]初始化一个,创建一个您可以修改的空字符串,不需要显式释放。

第二件事,你似乎在你的NSDictionnary中存储NSStrings中的群众,为什么你使用他们的integerValue方法stringWithFormat%d修饰符),而不是按原样使用它们? (NSStrings的stringWithFormat修饰符为%@

另外,你在开始时谈论UITextView,然后谈到UITextField,你确定你没有在某个地方犯错吗?我想你的格式化NSString的接收对象应该是UITextView(如果你同时有textField和textView)。

如果不是这个,也许你过早地调用detailIsotopes并且还创建了textView。尝试NSLog其地址,并在第一次看它是nil。如果您使用Interface Builder并且您的UITextField是ib插座,则可能是这种情况。如果这样做,那么您可以将您的字典和数组存储在viewController中,并在viewController的viewDidLoad方法中设置textField。或者在您显示视图后致电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,以便它永远不允许滚动。

希望有所帮助。