Objective c UITextField";“值已更改”;字段更新时不触发
我有一个Objective c UITextField";“值已更改”;字段更新时不触发,objective-c,ios,cocoa-touch,interface-builder,Objective C,Ios,Cocoa Touch,Interface Builder,我有一个iAction,已连接到Interface Builder中的UITextField元素。(在“值更改”事件时触发) 我还有一个UISlider,它可以在调整TextField元素的值时自动更新它 当我运行我的应用程序时,文本字段在我调整滑块时会更新,但发生这种情况时不会触发“值更改”事件。手动编辑TextField时,value changed事件也不会触发。(尽管使用Did编辑结束触发器确实会导致其触发) 我的问题是,如何让值更改触发器在文本字段的编程更新以及用户调整值时触发。根据T
iAction
,已连接到Interface Builder中的UITextField
元素。(在“值更改”事件时触发)
我还有一个UISlider
,它可以在调整TextField元素的值时自动更新它
当我运行我的应用程序时,文本字段在我调整滑块时会更新,但发生这种情况时不会触发“值更改”事件。手动编辑TextField时,value changed事件也不会触发。(尽管使用Did编辑结束触发器确实会导致其触发)
我的问题是,如何让值更改触发器在文本字段的编程更新以及用户调整值时触发。根据TheRonin的建议,使用
UITextFieldDelegate
并实现以下方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
不要对
UITextField
使用UIControlEventValueChanged
。您想要的是UIControlEventEditingChanged
要获取编辑更改的文本字段事件
,我建议将选择器添加为
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
随着textfield值的更改,您将从此textChanged:
选择器中获得的更改值
-(void)textChanged:(UITextField *)textField
{
NSLog(@"textfield data %@ ",textField.text);
}
如果您将委托分配给文本字段,那么请注意(当您不从下面的委托方法返回)时,将不会触发事件(编辑更改)。在从该方法返回“否”时考虑调用事件侦听器< /P>
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
对于Swift 3:
textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)
func textChanged() {
....
}
一个旧问题,但我找到的是第一个搜索结果,没有一个答案令人满意。我发现此解决方案最有效: 重写UITextField的text属性以添加didSet(),并从此处调用您的value changed函数
override open var text: String? {
didSet {
myValueDidChange()
}
}
Swift 4:
class YourViewController: UIViewController {
// MARK: Outlets
@IBOutlet weak var titleTextField: UITextField!
// MARK: View lifecycle
override func viewDidLoad() {
super.viewDidLoad()
titleTextField.delegate = self
}
}
// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
print("changed")
return true
}
}
虽然值是通过编程方式分配的,但在这种情况下,永远不会调用textFieldDidChange,因为实际上textField并没有更改。为此,需要传递外部事件 例如,textfield.sendActions(for:.editingChanged)这将触发编辑更改事件,即使以编程方式更改了值,也会调用textfielddichange 在何处应用此事件:
为文本字段赋值后,例如,textfield.text=“某些值”您好,为什么不使用UITextFieldDelegate方法?它们有不同的用途。
shouldChangeCharactersRange
允许您决定是否应该进行更改,并且您需要自己计算结果。因此,如果更改总是会发生,而您只关心更改的值ue是,使用UIControlEventEditingChanged
肯定更容易。我不是在争论是否有效,但我只是想知道为什么会出现这种情况?我尝试了这种方法,但当文本字段以编程方式更改时,它不会触发。正确,没有任何目标/操作事件被设计用于编程更改。这应该是正确的是公认的答案。UITextFieldDelegate
做了完全不同的事情。我是否在我的视图控制器中实现了这一点?是的。在.h文件接口声明中添加
。通过nib文件将textfield的委托设置为文件所有者。在viewcontroller中实现上述方法。当textfield以编程方式更新?使用此方法不是更有逻辑吗?uitextfieldtidchangenotification
,但是我不知道如何实现它。此方法的问题是在提交类型化字符之前调用它。也就是说,如果键入fo
,然后键入o
,则textField.text
仍然是fo
而不是foo
。您必须手动应用更改以获取textfield将设置为的字符串。编辑更改事件将不会触发,因为字段没有更改—这就是返回NO的作用!@olie—但有时您会在该委托方法中以编程方式更改字段,并且然后返回“否”以覆盖用户的默认文本。这是我的情况,此答案解决了问题。当然,但这不是编辑更改。如果您想这样做,您的代码还应该调用代理上更改的选择器。这样,您就可以完全控制。最简单的解决方案会在您期望的时间触发!我想知道为什么它们会e value changed事件,如果它不起作用当您想在编辑时获得输入时,您需要使用for:.editingChanged
@ChangnamHong如果它现在不起作用,您应该使用.valueChanged