当字段更新时,UITextField“值已更改”未触发

时间:2011-11-22 09:01:30

标签: objective-c ios cocoa-touch interface-builder

我有一个IBAction我已连接到Interface Builder中的UITextField元素。 (以“价值变化”事件为准)

我还有一个UISlider,可以在调整值时自动更新TextField元素。

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

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

8 个答案:

答案 0 :(得分:197)

不要将UIControlEventValueChanged用于UITextField。你想要的是UIControlEventEditingChanged

答案 1 :(得分:70)

要获得EditingChanged textfield event,我建议将选择器添加为

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

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

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

一个老问题,但我发现的第一个搜索结果,并没有一个答案令人满意。我发现这个解决方案效果最好:Swift UITextField subclass handle text change programmatically

覆盖UITextField的text属性以添加didSet(),并从那里调用值更改函数。

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

答案 5 :(得分: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
    }
}

答案 6 :(得分:0)

虽然通过编程方式分配了值,但在这种情况下,从不调用textFieldDidChange,因为实际上textField并未更改。对于此外部事件,需要通过

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

  

在何处应用此事件

为文本字段分配值后,例如 textfield.text =“某些值”

答案 7 :(得分:-3)

Swift 3

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

func textChanged() { 
 .... 
}