2011-11-22 20 views
56

我有已连接到在界面生成一个UITextField元件的IBAction。 (在“值已更改”事件上触发)的UITextField“值改变”不点火时字段被更新

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

当我运行我的应用程序,当我调整滑块的文本字段不会得到更新,但“值改为”发生这种情况时不会触发事件。手动编辑TextField时,值更改事件也不会触发。 (尽管使用“编辑结束”触发器确实会触发它)。

我的问题是,我怎么能得到的价值改变触发器触发的文本字段的两个纲领性更新,以及当用户调整值。

+0

嗨,为什么你没有使用UITextFieldDelegate方法? – TheRonin

+0

他们服务于不同的目的。 'shouldChangeCharactersInRange'允许你决定是否改变应该发生,你需要计算自己的结果。因此,如果改变总是会发生,而你只关心改变的值是什么,使用'UIControlEventEditingChanged'肯定是更容易。 –

回答

6

正如TheRonin建议,使用UITextFieldDelegate并实现以下方法

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

我是否在视图控制器中实现了这个功能? –

+0

是的。在.h文件接口声明中添加''。通过nib文件将文本字段的委托设置为文件所有者。在视图控制器内部实现上述方法。 – Ilanchezhian

+1

当编程更新文本字段时,这也可以工作吗? –

156

不要为UITextField使用UIControlEventValueChanged。你想要的是UIControlEventEditingChanged

+3

我不是认为如果有效或不可行,但我只想知道为什么会出现这种情况? – trojanfoe

+3

我试过那个,当文本框被编程改变时它不会触发。 –

+3

正确,没有任何目标/操作事件被设计调用程序更改。 –

61

要获得EditingChanged textfield event,作为

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

由于文本框的值更改,更改后的值,你会从这个textChanged:选择让我建议加法选择。

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

最简单的解决方案,完全按照您的预期发生! – RyJ

+0

我想知道为什么他们有值更改事件,如果它不工作 – Shiva

10

如果你是分配一个代表到文本字段,然后注意(当你从下面的委托方法没有返回,不会触发事件(编辑更改)。考虑调用事件侦听器时,你从做这种方法

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

编辑更改事件将不会被触发,因为该字段*没有改变* - 这就是返回NO做的! – Olie

+0

@olie - 但是有时候你会在该委托方法中以编程方式更改字段,然后返回NO以覆盖用户的默认文本。这是我的情况,这个答案解决了这个问题。 – kleezy

+0

当然,但这不是*编辑*更改。如果你想这样做,你的代码也应该调用委托上的更改选择器。那样,你完全可以控制。 – Olie

-1

返回NO对于斯威夫特3

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

func textChanged() { 
.... 
} 
+3

当你想在编辑时得到输入时,你需要使用'for:.editingChanged'。 –

+0

@ChangnamHong现在不行,你应该使用'.valueChanged' – UnRewa

1

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

覆盖的UITextField的text属性添加didSet(),并调用你的价值从那里更改的功能。

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

一个精明的贡献。 – Fattie

+0

罗伯特 - 你看起来像我。我几乎在W.M.L工作。 ! :)我们都做同样的事情,并且有同样的后代。辣妈! :) – Fattie