2012-04-28 28 views
59

我试图在单独的UILabel上显示对UITextField所做的更改。在用户输入每个字符后,是否有方法可以捕获UITextField的全文?目前我正在使用这种方法,但它不捕获用户输入的最后一个字符。iPhone如何在输入时获取UITextField的文本?

我知道UITextView有“didChange”方法,但我找不到UITextField的方法。

//does not capture the last character 

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

     [self updateTextLabelsWithText: textField.text]; 

    return YES; 
} 

我如何可以采取文字出来的UITextField的每个字符之后输入?

谢谢!

+0

退房:http://stackoverflow.com/questions/388237/getting-the-value-of-a-uitextfield-as-keystrokes-are-entered – hanumanDev 2012-04-28 13:23:09

回答

134
  1. 首先添加一个UITextFieldUILabel到情节提要/笔尖
  2. 现在分配IBOutletUILabel(这里我用myLabel
  3. 分配UITextFieldDelegate到文件的所有者,也实现.H相同的委托文件
  4. 使用这些代码:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
        [self updateTextLabelsWithText: newString]; 
    
        return YES; 
    } 
    
    -(void)updateTextLabelsWithText:(NSString *)string 
    { 
        [myLabel setText:string]; 
    } 
    

希望这有助于。

+0

Hummmmm那是很不错的THX。 ..... :) – 2015-04-24 06:48:33

+0

它适用于我.... – 2015-10-06 11:55:05

+0

如果我逐个删除字符。这种方法不打电话 – 2017-03-31 07:00:09

67

简单处理“的编辑更改”事件的

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

和选择:

-(void) editingChanged:(id)sender { 
    // your code 
} 

您可以手动执行此操作,或按CTRL-拖动故事板“编辑而改变”已发送事件给你的.h,为你创建editingChanged方法。

+3

你的解决方案是完美的!谢谢 – SpaceDog 2014-06-08 17:52:24

+10

这实际上是一个接受的更好的解决方案。谢谢!。当您从文本字段中删除最后一个字符时,接受的答案不会完全清除标签文本。 – Menno 2014-09-03 14:47:24

+0

这应该选为答案 – Lucas 2015-08-10 17:52:09

5

在斯威夫特2.0+

class CheckInViewController: UIViewController, UITextFieldDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    yourTextField.delegate = self 

} 

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { 
    var updatedTextString : NSString = textField.text as NSString 
    updatedTextString = updatedTextString.stringByReplacingCharactersInRange(range, withString: string) 

    self.methodYouWantToCallWithUpdatedString(updatedTextString) 
    return true 
} 

} 

希望它可以帮助你快速的先驱

3

斯威夫特与addTarget斯威夫特2.0+

titleTextField.addTarget(self, action: #selector(textFieldTyping), forControlEvents: .EditingChanged) 

并实行selector

func textFieldTyping(textField:UITextField) 
{ 
    //Typing 
} 
1

在雨燕3.0:

一些解决方案的背后都是一个字符,或更早版本雨燕的OBJ-C的。这是我用于Swift 3.0的内容

在类中,我声明了一个占位符来存储文本。

var tempName = "" 

在viewDidLoad中我使用:

nameField.addTarget(self, action: #selector(typingName), for: .editingChanged) 

然后我做了一个调用的函数:

func typingName(textField:UITextField){ 

     if let typedText = textField.text { 
      tempName = typedText 
      print(tempName) 
     } 
    } 
0

斯威夫特3.0+:这个工作非常漂亮,对我来说。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    self.yourLabel.text = "\(textField.text ?? "")\(string)" 
    return true 
} 
0
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     if textField == yourTextFieldOutletName 
     { 
      if yourTextFieldOutletName.isEmpty == false 
      { 
      youtlabelname.text = yourTextFieldOutletName.text! 
      } 


     } 

     return true 

    } 

func textViewDidEndEditing(_ textView: UITextView) { 
     if textField == yourTextFieldOutletName 
      { 
       if yourTextFieldOutletName.isEmpty == false 
       { 
       youtlabelname.text = yourTextFieldOutletName.text! 
       } 


      } 
    } 
相关问题