清除 UITextField 的最佳方法

问题描述 投票:0回答:6

对于

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

textFieldX.text = nil

textFieldX.text = @"";

在 Objective-C 中,向

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

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

iphone objective-c memory-management uitextfield
6个回答
35
投票

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

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


11
投票

我通常这样做

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


4
投票

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

 wordTextField.textAlignment = UITextAlignmentCenter;
 //wordTextField.text = @"";
 wordTextField.text = nil;
 translationTextField.textAlignment = UITextAlignmentCenter;
 //translationTextField.text = @"";
 translationTextField.text = nil;

2
投票

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

为了唱反调,我假设编译器会优化选项 B 来执行类似于选项 A 的操作。就我个人而言,我总是会选择选项 B,因为就您想要完成的最终操作而言,它更具可读性。

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

清除按钮模式

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

@property(非原子) UITextFieldViewMode 清除按钮模式

讨论

显示标准清除按钮 在文本字段的右侧为 用户删除文本的方法 迅速地。出现这个按钮 根据设置的值自动 对于这个属性。

该属性的默认值为 UITextFieldViewModeNever。

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


0
投票

我发现使用

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

使用上述代码时,按清除按钮后,按数字不会出现在屏幕上。

textField.text = @""; 

对我来说很有用。


0
投票

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

// [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()
© www.soinside.com 2019 - 2024. All rights reserved.