Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UITextField";“值已更改”;字段更新时不触发_Objective C_Ios_Cocoa Touch_Interface Builder - Fatal编程技术网

Objective c UITextField";“值已更改”;字段更新时不触发

Objective c UITextField";“值已更改”;字段更新时不触发,objective-c,ios,cocoa-touch,interface-builder,Objective C,Ios,Cocoa Touch,Interface Builder,我有一个iAction,已连接到Interface Builder中的UITextField元素。(在“值更改”事件时触发) 我还有一个UISlider,它可以在调整TextField元素的值时自动更新它 当我运行我的应用程序时,文本字段在我调整滑块时会更新,但发生这种情况时不会触发“值更改”事件。手动编辑TextField时,value changed事件也不会触发。(尽管使用Did编辑结束触发器确实会导致其触发) 我的问题是,如何让值更改触发器在文本字段的编程更新以及用户调整值时触发。根据T

我有一个
iAction
,已连接到Interface Builder中的
UITextField
元素。(在“值更改”事件时触发)

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

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


我的问题是,如何让值更改触发器在文本字段的编程更新以及用户调整值时触发。

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

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

不要对
UITextField
使用
UIControlEventValueChanged
。您想要的是
UIControlEventEditingChanged

要获取
编辑更改的文本字段事件
,我建议将选择器添加为

[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
随着textfield值的更改,您将从此
textChanged:
选择器中获得的更改值

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

如果您将委托分配给文本字段,那么请注意(当您不从下面的委托方法返回)时,将不会触发事件(编辑更改)。在从该方法返回“否”时考虑调用事件侦听器< /P>

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

对于Swift 3

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

func textChanged() { 
 .... 
}

一个旧问题,但我找到的是第一个搜索结果,没有一个答案令人满意。我发现此解决方案最有效:

重写UITextField的text属性以添加didSet(),并从此处调用您的value changed函数

  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
    }
}

虽然值是通过编程方式分配的,但在这种情况下,永远不会调用textFieldDidChange,因为实际上textField并没有更改。为此,需要传递外部事件

例如,textfield.sendActions(for:.editingChanged)这将触发编辑更改事件,即使以编程方式更改了值,也会调用textfielddichange

在何处应用此事件:


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

您好,为什么不使用UITextFieldDelegate方法?它们有不同的用途。
shouldChangeCharactersRange
允许您决定是否应该进行更改,并且您需要自己计算结果。因此,如果更改总是会发生,而您只关心更改的值ue是,使用
UIControlEventEditingChanged
肯定更容易。我不是在争论是否有效,但我只是想知道为什么会出现这种情况?我尝试了这种方法,但当文本字段以编程方式更改时,它不会触发。正确,没有任何目标/操作事件被设计用于编程更改。这应该是正确的是公认的答案。
UITextFieldDelegate
做了完全不同的事情。我是否在我的视图控制器中实现了这一点?是的。在.h文件接口声明中添加
。通过nib文件将textfield的委托设置为文件所有者。在viewcontroller中实现上述方法。当textfield以编程方式更新?使用此方法不是更有逻辑吗?
uitextfieldtidchangenotification
,但是我不知道如何实现它。此方法的问题是在提交类型化字符之前调用它。也就是说,如果键入
fo
,然后键入
o
,则
textField.text
仍然是
fo
而不是
foo
。您必须手动应用更改以获取textfield将设置为的字符串。编辑更改事件将不会触发,因为字段没有更改—这就是返回NO的作用!@olie—但有时您会在该委托方法中以编程方式更改字段,并且然后返回“否”以覆盖用户的默认文本。这是我的情况,此答案解决了问题。当然,但这不是编辑更改。如果您想这样做,您的代码还应该调用代理上更改的选择器。这样,您就可以完全控制。最简单的解决方案会在您期望的时间触发!我想知道为什么它们会e value changed事件,如果它不起作用当您想在编辑时获得输入时,您需要使用
for:.editingChanged
@ChangnamHong如果它现在不起作用,您应该使用
.valueChanged