清除 UITextField 的最佳方式

Best way to clear a UITextField

提问人:Brenden 提问时间:7/23/2009 更新时间:11/17/2023 访问量:44484

问:

对于一个,就内存管理或其他原因而言,如何清除文本值是否重要?IBOutlet UITextField

textFieldX.text = nil

textFieldX.text = @"";

在 objective-c 中,向对象发送消息是可以接受的,并且是一个静态的 .我不确定是否每个都指向内存中的同一对象,或者它是否分配了一堆 1 字节的 null 终止字符串。nil@""NSString *@""

没什么大不了的,只是想问问社区。谢谢。

iPhone Objective-C 内存管理 UITtextField

评论


答:

2赞 TahoeWolverine 7/23/2009 #1

字符串总是在 Objective-C 中复制,所以第二个选项很可能是创建另一个字符串,然后指向它。这样,我认为你是对的。

为了扮演魔鬼的拥护者,我假设编译器优化了选项 B 以执行类似选项 A 的事情。就我个人而言,我总是会做选项 B,因为就您想要完成的最终操作而言,它更具可读性。

更新:我没有找到一种不同方式实现目标的方法,但你可能对这个花絮感兴趣(来自 Apple UITextField Docs):

clearButton模式

控制标准何时清除 按钮出现在文本字段中。

@property(非原子) UITextFieldViewMode clearButtonMode

讨论

显示标准清除按钮 在文本字段的右侧作为 用户删除文本的一种方式 迅速。此时将显示此按钮 根据设置的值自动 对于此属性。

此属性的默认值为 UITextFieldViewModeNever。

我认为这将允许您为用户设置清除文本字段的功能。

评论

0赞 Brenden 7/23/2009
如果这有意义的话,我更多地是在viewWillAppear上以编程方式清除文本以编辑对象。
11赞 Dan Lorenc 7/23/2009 #2

我通常只是为了清楚起见而这样做。这有助于我记住该值应该是一个字符串,并且我可以将所有标准字符串方法传递给它。textFieldX.text = @"";

评论

0赞 Supertecnoboff 8/23/2015
这是否会使占位符字符串重新出现?
1赞 vichle 10/21/2015
我可以确认它确实如此,@Supertecnoboff
35赞 Brad The App Guy 7/23/2009 #3

就我个人而言,我会少考虑这里的内存使用,而更多地考虑代码的可维护性。

对我来说,标签总是有一个字符串是有道理的。将来,有人可能会尝试附加标签值,将其保存在数据库中,将其包装在xml中,等等。在这种情况下,空的 NSString 对我来说比0x0更有意义。

评论

0赞 Brenden 7/23/2009
所有的回应都很棒,谢谢。不过,这是一个很好的观点。代码一致性。谢谢大家。
4赞 Denis Kutlubaev 7/5/2011 #4

我建议你使用nil,因为我发现当你使用@“”时,占位符没有在中心对齐(如果它必须对齐)。看,我是如何更改代码以正确对齐占位符的。

 wordTextField.textAlignment = UITextAlignmentCenter;
 //wordTextField.text = @"";
 wordTextField.text = nil;
 translationTextField.textAlignment = UITextAlignmentCenter;
 //translationTextField.text = @"";
 translationTextField.text = nil;
0赞 Tander 7/11/2012 #5

我发现使用对我的项目有不良影响。我正在构建一个计算器。textField.text = nil;

使用上述代码时,按下清除按钮后,屏幕上没有出现按数字。

textField.text = @""; 

对我有好处。

-1赞 Jinwoo Kim 11/17/2023 #6

要获得撤消/重做支持,您可以像这样实现

// [Public]
textField.selectAll(nil)
if let range = textField.selectedTextRange {
  textField.replace(range, withText: "")
}

// [Private]
let _fieldEditor: AnyObject = textField.perform(Selector(("_fieldEditor"))).takeRetainedValue()
let _inputController: AnyObject = _fieldEditor.perform(Selector(("_inputController"))).takeRetainedValue()
_ = _inputController.perform(Selector(("clearText"))).takeUnretainedValue()

评论

0赞 HangarRash 11/18/2023
代码与撤消/重做支持有什么关系?为什么清除文本字段的代码非常奇怪?
0赞 Jinwoo Kim 11/18/2023
setText: 方法重置 NSUndoManager 的撤消堆栈,但 UITextInput 方法(如 'insert' 和 'replace')不会重置撤消堆栈。如果看到 UITextField 的清除按钮 (-[UITextField _clearButtonClicked:]) 的实现,你会发现它具有类似的代码行为。试试吧。你可以看到区别。