2011-11-22 98 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