Interface BuilderでIBAction
要素に接続したUITextField
があります。 (「値が変更された」イベントの発生)
また、値が調整されるとTextField要素を自動的に更新するUISlider
もあります。
アプリを実行すると、スライダーを調整するとTextFieldが更新されますが、これが発生すると「値が変更されました」イベントは発生しません。 TextFieldを手動で編集しても、value changedイベントは発生しません。 (Did Editing Endトリガーを使用すると、トリガーが起動しますが)。
私の質問は、TextFieldのプログラムによる更新と、ユーザーが値を調整したときの両方で、値変更トリガーを起動する方法です。
TheRoninが示唆するように、UITextFieldDelegate
を使用して、次のメソッドを実装します
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
UIControlEventValueChanged
にUITextField
を使用しないでください。必要なのはUIControlEventEditingChanged
です。
取得するため EditingChanged textfield event
、次のようにセレクタを追加することをお勧めします
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
テキストフィールドの値が変更されると、このtextChanged:
セレクター。
-(void)textChanged:(UITextField *)textField
{
NSLog(@"textfield data %@ ",textField.text);
}
テキストフィールドにデリゲートを割り当てる場合、(以下のデリゲートメソッドからNOを返すと、イベント(編集の変更)はトリガーされません。このメソッドからNOを返す場合は、イベントリスナーを呼び出すことを検討してください。
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
古い質問ですが、最初に見つけた検索結果で、満足できる答えはありません。このソリューションが最適に動作することがわかりました: Swift UITextFieldサブクラスはプログラムでテキストの変更を処理します 。
UITextFieldのテキストプロパティをオーバーライドしてdidSet()を追加し、そこから値変更関数を呼び出します。
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
}
}
値はプログラムで割り当てられますが、その場合、実際にはtextFieldが変更されていないため、textFieldDidChangeが呼び出されることはありません。この外部イベントのために渡す必要があります
例:textfield.sendActions(for:.editingChanged)これは、変更された編集イベントを発生させ、値がプログラムで変更された後でもtextFieldDidChangeが呼び出されます。
このイベントを適用する場所:
提出されたテキストに値を割り当てた後、例えばtextfield.text = "some value"