NSString *tmpTxt = textField.text;
BOOL result = [textField becomeFirstResponder];
textField.text = tmpTxt;
这种方法有80%的时间可以使用,但偶尔会:
什么是textField成为FirstResponder并保持其文本值的最佳方式。
答案 0 :(得分:4)
如果它变为第一个响应者时清除它,我想是你有@property(非原子)BOOL clearsOnBeginEditing设置为YES。
也许,无论你在哪里创建textField,都要添加textField.clearsOnBeginEditing = NO;
如果您使用的是界面构建器,则文本域的属性中会出现一个复选框。
至于为何大部分时间崩溃......
text属性定义为:@property(nonatomic,copy)NSString * text
复制意味着当您为其分配值时,它将释放先前的值,然后复制传入的值。
你的第一行是保持指向NSString对象的指针而不调用retain。因此,当调用带有clearsOnBeginEditing的becomeFirstResponder时,它会将新值设置为空的NSString,这将释放UITextField引用的旧NSString。由于它唯一拥有它的东西,该释放调用将在NSString上调用dealloc,使其无效。
然后将其重新分配回text属性,在该属性中它尝试复制已释放的对象。
所以要按照你的方式去做,你需要调用retain和release:
NSString *tmpTxt = [textField.text retain];
BOOL result = [textField becomeFirstResponder];
textField.text = tmpTxt;
[tmpTxt release];
但是,您需要做的就是将clearsOnBeginEdit设置为NO,您将不需要该代码。