UITextField“值更改”在字段更新时不触发


72

我已经IBAction连接到UITextFieldInterface Builder中的一个元素。(发生“值已更改”事件时触发)

我还有一个UISlider在调整其值时自动更新TextField元素的。

当我运行我的应用程序时,当我调整滑块时,TextField确实会更新,但是这种情况不会触发“值已更改”事件。当我手动编辑TextField时,值更改事件也不会触发。(尽管使用“ Did Editing End”触发器确实会触发它)。

我的问题是,如何以编程方式更新TextField以及用户调整值时如何触发值更改触发器。


嗨,为什么不使用UITextFieldDelegate方法?
TheRonin

2
它们有不同的用途。shouldChangeCharactersInRange使您可以决定是否应该进行更改,并且需要计算结果将是您自己。因此,如果更改总是会发生,而您只在乎更改的值是什么,使用UIControlEventEditingChanged绝对肯定会更容易。
superarts.org

Answers:


0

根据TheRonin的建议,使用UITextFieldDelegate并实现以下方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

我可以在我的视图控制器内部实现吗?
Andrew Lauer Barinov

是。<UITextFieldDelegate>在.h文件接口声明中添加。通过nib文件将文本字段的委托设置为文件所有者。在viewcontroller中实现上述方法。
Ilanchezhian 2011年

1
以编程方式更新文本字段时,这是否也起作用?
Andrew Lauer Barinov 2011年

3
这不是更合逻辑吗?UITextFieldTextDidChangeNotification,但是我不确定如何实现。
Andrew Lauer Barinov 2011年

19
这种方法的问题是在提交键入的字符之前调用它。也就是说,如果您先输入fo然后输入o,则textField.textis仍然fo没有foo。您必须手动应用更改,以获取将文本字段设置为的字符串。
DarkDust 2014年

223

请勿UIControlEventValueChanged用于UITextField。你想要的是UIControlEventEditingChanged


4
我不是在争论是否行得通,但我只想知道为什么会这样?
trojanfoe11年

3
我尝试了一个,但以编程方式更改了文本字段时却不会触发。
Andrew Lauer Barinov 2011年

3
正确,没有通过设计针对编程更改调用任何目标/动作事件。
马克·亚当斯

6
这应该是公认的答案。UITextFieldDelegate做完全不同的事情。
superarts.org

71

为了得到EditingChanged textfield event,我建议添加选择器为

[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];

随着文本字段值的更改,您将从此textChanged:选择器获得更改的值。

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}

最简单的解决方案,可在您期望的时间触发!
RyJ 2015年

1
我想知道为什么他们有价值改变事件,如果它不起作用
Shiva

11

如果要在文本字段中分配委托,则请注意(当您从下面的委托方法中返回NO时,将不会触发事件(编辑已更改)。请考虑从该方法中返回NO时调用事件侦听器)

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

3
因为该字段没有更改,所以不会触发Editing Changed事件,这就是返回NO的原因!
Olie 2015年

@olie-但是有时您可以在该委托方法中以编程方式更改字段,然后返回NO来覆盖用户的默认文本。这是我的情况,这个答案解决了问题。
克莱·加勒特

当然可以,但这不是编辑更改。如果要执行此操作,您的代码还应该在委托上调用更改后的选择器。这样,您完全可以控制。
奥利2015年

3

一个老问题,但我找到的第一个搜索结果,没有一个令人满意的答案。我发现此解决方案最有效:Swift UITextField子类以编程方式处理文本更改

重写UITextField的text属性以添加didSet(),然后从此处调用更改了值的函数。

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }

1

尽管通过编程方式分配了值,但在那种情况下,textFieldDidChange从未被调用,因为实际上textField并没有改变。对于这个外部事件需要通过

例如,textfield.sendActions(for:.editingChanged)将触发编辑更改的事件,并且即使在以编程方式更改值之后,textFieldDidChange也将被调用。

在哪里申请此活动

在为文本字段分配值之后,例如textfield.text =“ some value”


0

斯威夫特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
    }
}

-3

对于Swift 3

textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)

func textChanged() { 
 .... 
}

4
如果要在编辑时获取输入,则需要使用for: .editingChanged
昌南洪

@ChangnamHong现在不起作用了,您应该使用.valueChanged
UnRewa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.