天道酬勤,学无止境

How does the methods “shouldChangeTextInRange” and “stringByReplacingCharactersInRange” work?

I would like to know the working of the following code.

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    return !([newString length] > 10);
}

What does "stringByReplacingCharactersInRange" do? And how does the above method limit the number of characters that can be entered in the textField?

Thanks in advance!

评论

textField:shouldChangeCharactersInRange:replacementString: is UITextFieldDelegate method that gets called any time text field's contents are about to change (entering, deleting, cutting or pasting text into the text field), asking the delegate if it wants to allow this change.

stringByReplacingCharactersInRange:withString: is an NSString instance method that does exactly what it says, replaces some text in current string with another string, creating a new string.

The code you have checks if the string that would be a result of this change is longer than 10 characters and if it is, delegate will return NO and text field contents will not change. If the resulting string would be 10 characters or less, delegate will return YES and text field's contents will change to the same string that you got in newString.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何用返回键关闭UITextView的键盘?(How to dismiss keyboard for UITextView with return key?)
    问题 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么您的答案正确的解释。 答案不够详细的答案可能会被编辑或删除。 在IB的库中,引言告诉我们,当按下返回键时, UITextView的键盘将消失。 但是实际上,返回键只能充当'\ n'。 我可以添加一个按钮,然后使用[txtView resignFirstResponder]隐藏键盘。 但是,有没有一种方法可以在键盘中为返回键添加操作,这样我就不必添加UIButton ? 回答1 UITextView没有任何在用户按下返回键时将被调用的方法。 如果希望用户只能添加一行文本,请使用UITextField 。 按下返回键并隐藏UITextView的键盘不遵循界面准则。 即使这样,如果要执行此操作,请实现UITextViewDelegate textView:shouldChangeTextInRange:replacementText:方法,然后检查替换文本是否为\n ,并隐藏键盘。 可能还有其他方法,但我不知道。 回答2 想通了,我会在此处发布代码段: 确保声明对UITextViewDelegate协议的支持。 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *
  • 如何从iOS应用程序上的自定义键盘检索击键?(How do I retrieve keystrokes from a custom keyboard on an iOS app?)
    问题 我需要为iPhone应用程序构建自定义键盘。 以前有关该主题的问题和答案都集中在自定义键盘的视觉元素上,但是我试图了解如何从此键盘中检索击键。 Apple提供了inputView机制,该机制使将自定义键盘与UITextField或UITextView关联起来变得容易,但是它们不提供将生成的击键发送回关联对象的功能。 基于这些对象的典型委派,我们期望使用三种功能:一种是普通字符,一种是用于退格,另一种是用于输入。 然而,似乎没有人明确定义这些功能或如何使用它们。 如何为我的iOS应用构建自定义键盘并从中检索键击? 回答1 Greg的方法应该可以工作,但是我有一种方法不需要将键盘告知文本字段或文本视图。 实际上,您可以创建一个键盘实例,并将其分配给多个文本字段和/或文本视图。 键盘处理知道哪个是第一响应者。 这是我的方法。 我不会显示任何用于创建键盘布局的代码。 那是容易的部分。 此代码显示了所有管道。 编辑:已更新为正确处理UITextFieldDelegate textField:shouldChangeCharactersInRange:replacementString:和UITextViewDelegate textView:shouldChangeTextInRange:replacementText: 头文件: @interface SomeKeyboard
  • Swift-如何在Firebase中使用“ shouldChangeTextInRange”进行实时搜索?(Swift - How Can I use 'shouldChangeTextInRange' with Firebase for real time searching?)
    问题 我不知道如何创建Firebase MatchRegsexex查询并使用shouldChangeTextInRange列出当前结果。 我之前在Parse中做到了,它用于在Parse Cloud中搜索用户名或用户全名。 如果有人阐明了我在Firebase中执行此操作的方法,那将是很棒的。 // search updated func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { // find by username let usernameQuery = PFQuery(className: "_User") usernameQuery.whereKey("username", matchesRegex: "(?i)" + searchBar.text!) usernameQuery.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { // if no objects are found according to entered text in
  • 限制uitextview中的字符数(Limit number of characters in uitextview)
    问题 我正在提供文本视图以鸣叫一些字符串。 我正在应用以下方法将字符数限制为140个长度。 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ return [[textView text] length] <= 140; } 该代码运行良好,但第一个条件是退格不起作用。 假设我已经达到了140个字符的限制,因此该方法将给我错误,并且用户无法插入更多字符,但是此后,当我尝试删除一些字符时,文本视图将被禁用。 因此,问题是:“如何从textview.text删除字符或重新启用文本视图?” 回答1 如苹果参考资料所述,您应该寻找一个空字符串 如果用户按下Delete键,则范围的长度为1,并且空字符串对象替换了该单个字符。 我认为您实际要进行的检查类似于[[textView text] length] - range.length + text.length > 140 ,以说明剪切/粘贴操作。 回答2 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *
  • Xcode 4.2 按下“完成/返回”按钮时如何隐藏文本框键盘(How to hide Textbox Keyboard when “Done / Return” Button is pressed Xcode 4.2)
    问题 我在 Interface Builder 中创建了一个文本字段。 我将它的“返回键”设置为完成。 这是一个只有一行的输入(所以它不需要多行)。 当用户点击完成按钮时如何隐藏虚拟键盘? 回答1 实现委托方法UITextFieldDelegate ,然后: - (void)viewDidLoad { [super viewDidLoad]; self.yourIBtextField.delegate = self; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return NO; } 回答2 UITextView 没有任何方法可以在用户点击返回键时调用。 即使这样,如果你想这样做,实现 UITextViewDelegate 的 textView:shouldChangeTextInRange:replacementText: 方法并检查替换文本是否\n,隐藏键盘。 可能还有其他方法,但我不知道任何方法。 确保声明对 UITextViewDelegate 协议的支持。 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
  • Delete (not Backspace) doesn't fire UITextViewDelegate's shouldChangeTextInRange
    When using an external keyboard, my UITextView fires a shouldChangeTextInRange message just fine when I press the Backspace key ("backward delete"), but if I press Delete ("forward delete") then the method is never called at all, despite the view's text changing as expected. In case it matters, I'm using Swift and the latest iOS simulator. If this is expected behavior, can someone point me to the documentation that explains it? More importantly, is there a workaround? Edit: submitted rdar://18909378. I've also discovered the same behavior when using cmd+backspace and opt+backspace. Very
  • ShouldChangeTextInRange is not called for UITextView
    I user custom UITextView and need to hide keyboard on return click. I need to catch 'ShouldChangeTextInRange' what has textview, I don't know why but method is not called. here is code of for my text view : public class PlaceholderTextView : UITextView { public PlaceholderTextView () { Initialize (); } public PlaceholderTextView (CGRect frame) : base (frame) { Initialize (); } public PlaceholderTextView (IntPtr handle) : base (handle) { Initialize (); } void Initialize () { Text = Placeholder; ShouldBeginEditing = t => { if (Text == Placeholder) Text = string.Empty; return true; }
  • Swift - How Can I use 'shouldChangeTextInRange' with Firebase for real time searching?
    I wonder that how creating Firebase matchesRegex query and listing current results using shouldChangeTextInRange. I have did it before in Parse for searching username or user fullname in Parse Cloud. If someone shed light my path to do it in Firebase, it would be great. // search updated func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { // find by username let usernameQuery = PFQuery(className: "_User") usernameQuery.whereKey("username", matchesRegex: "(?i)" + searchBar.text!) usernameQuery.findObjectsInBackgroundWithBlock {
  • 如何禁用iOS 8表情符号键盘?(How to disable iOS 8 emoji keyboard?)
    问题 是否有任何选项可以停止在iOS 8中显示表情符号键盘? 它在numpad和安全文本中不可用,但在电子邮件中可用。 如果无法禁用它,如何从表情符号中获取字符串值? 回答1 试试这个: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField isFirstResponder]) { if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) { return NO; } } return YES; } 有关更多信息,请参见此处。 编辑 : 您可以使用以下代码从键盘隐藏表情符号: txtField.keyboardType=UIKeyboardTypeASCIICapable; 编辑 : 使用“界面”构建器从键盘隐藏表情符号选择。 回答2 这适用于iOS 7和8: - (BOOL)textField:(UITextField *)textField
  • 如何知道何时将文本粘贴到UITextView中(how to know when text is pasted into UITextView)
    问题 将一块文本粘贴到UITextView中时会触发什么事件? 粘贴文本时,我需要修改textView的框架。 谢谢阅读。 回答1 您的UITextView将调用其UITextViewDelegate方法 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 如果已建立代表。 当在键盘上键入一个字符以及将文本粘贴到文本视图中时,都会调用此方法。 粘贴的文本是replaceText参数。 参见http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextViewDelegate_Protocol/Reference/UITextViewDelegate.html#//apple_ref/occ/intf/UITextViewDelegate 回答2 这是我用来检测UITextView中的粘贴事件的方法: // Set this class to be the delegate of the UITextView. Now when a user will paste a text in that textview, this
  • 防止用户在SLComposeViewController中修改部分文本(Prevent users from modifying part of the text in SLComposeViewController)
    问题 现在,我们的代码设置为从UITextField中获取文本,作为Facebook / Twitter帖子的setInitialText 。 我们要做的是:在Facebook / Twitter帖子中添加其他永久消息或URL。 我们应该怎么做? 这是我们当前的代码: [slComposeThirdViewController setInitialText:[[self QText]text]]; [self presentViewController:slComposeThirdViewController animated:YES completion:nil]; 回答1 这涉及到一点点,所以请在这里忍受...这仅适用于SLServiceTypeTwitter 对于任何有兴趣阅读此书的人,我已在Github上放置了一个示例项目:https://github.com/NSPostWhenIdle/Immutable-SLComposeViewController 您要做的第一件事是确保您的视图控制器符合UITextViewDelegate 。 您还需要为UITextView创建一个iVar。 您实际上不会创建文本视图,但是您将需要一个指针直接分配给SLComposeViewController内部的文本视图。 当您在这里时,也为永久字符串创建一个iVar。 @interface
  • How to decipher “objc_method_description” from protocol method description list?
    I have some Swift 3 code to decode an iOS Objective-C protocol (which has a Swift counterpart). After concluding Swift 3 reflection was not developed enough to accomplish what I needed, I stumbled on the objc runtime method protocol_copyMethodDescriptionList(), which returns an array of the following C structs: struct objc_method_description SEL name; char *types; }; The code fetches a list of protocol selector names, but not sure what's being returned in the type field. I'm confused about how to properly decode objc_method_description.type values. What I'm getting in the the type fields are
  • “ [NSBigMutableString substringWithRange:]:范围{0,10}超出范围; 撤消时字符串长度9”错误(“[NSBigMutableString substringWithRange:]: Range {0, 10} out of bounds; string length 9” error with Undo)
    问题 当我尝试在UISearchBar撤消操作时,我的应用程序崩溃了。 在我的应用程序中,我具有防止在搜索栏上输入'%'符号的代码,为此,它将textDidChange方法中的%替换为@“”,如下所示: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { self.searchBar.text = [searchText stringByReplacingOccurrencesOfString:@"%" withString:@""]; } 因此,如果我输入文本“ abc%xyz”,则在搜索栏中可见的最终文本将是“ abcxyz”。 不,当我单击“撤消”时,我看到“ xyz”被清除了,我仍然在搜索栏上看到“ abc”,而不是一次全部清除“ abcxyz”。 现在,如果我再次单击撤消以清除'abc',则我的应用程序将崩溃,并显示[NSBigMutableString substringWithRange:]: Range out of bounds错误。 我假设即使将'%'替换为@“”,撤消管理器也可能仍将其保留,因此范围超出了范围。 我试过[searchBar.undoManager removeAllActions]; 在% textDidChange用@“”替换后
  • iPhone:禁用“双击空格键。” 捷径?(iPhone: Disable the “double-tap spacebar for .” shortcut?)
    问题 默认情况下,如果在iPhone或iPad上点按两次空格键,则不会得到“”(两个空格),而是得到“。”(一个句点后跟一个空格)。 有什么方法可以在代码中禁用此快捷方式吗? 更新:通过UITextInputTraits禁用自动更正不起作用。 更新2:知道了! 请参阅下面的我的帖子。 回答1 我有一个基于以上Chaise给出的答案。 Chaise的方法不允许您依次键入两个空格-在某些情况下这是不希望的。 这是一种完全关闭自动周期插入的方法: 迅速 在委托方法中: func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { //Ensure we're not at the start of the text field and we are inserting text if range.location > 0 && text.count > 0 { let whitespace = CharacterSet.whitespaces let start = text.unicodeScalars.startIndex let location = textView.text.unicodeScalars.index
  • 替换 UITextView 中的文本(Replacing Text in a UITextView)
    问题 我正在尝试编写一个小概念应用程序,它在用户在 UITextView 中键入时读取字符流,并在输入某个单词时将其替换(有点像自动更正)。 我考虑使用 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; 但到目前为止我没有运气。 谁能给我一个提示。 不胜感激! 大卫 回答1 这才是正确的方法。 它的对象是否设置为UITextView的委托? 更新: - 固定上面说“UITextView”(我以前有“UITextField”) -在下面添加了代码示例: 这个方法实现进入 UITextView 的委托对象(例如它的视图控制器或应用程序委托): // replace "hi" with "hello" - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { // create final version of textView after the current text has been inserted NSMutableString
  • 如何允许将 NSAttributedString 文本输入到 UITextView 中?(How to allow NSAttributedString text be typed into a UITextView?)
    问题 我试图允许将不同样式的文本输入到 UITextView 中,有点像使用粗体或斜体等简单属性的文本编辑器。 我知道通过使用 textView 的attributedText属性,我可以将属性应用于特定范围的文本。 这很好,但我希望能够在 textView 中输入属性文本,这将通过按钮切换(例如输入粗体文本)。 这是我到目前为止想到的: 我使用了-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text UITextView 委托方法来获取text参数,并通过创建具有相同属性的 NSAttributedString 来修改它的属性文本。 然后创建一个 NSMutableAttributedString,它是textView的属性文本的副本。 使用appendAttributedString附加这两个,然后将appendAttributedString的attributedText appendAttributedString属性设置为生成的属性appendAttributedString 。 这是代码: -(BOOL)textView:(UITextView *)textView
  • 更改框架时,UITextView光标位于框架下方(UITextView cursor below frame when changing frame)
    问题 我有一个包含UITextView的UIViewCOntroller 。 当键盘出现时,我会像这样调整其大小: #pragma mark - Responding to keyboard events - (void)keyboardDidShow:(NSNotification *)notification { NSDictionary* info = [notification userInfo]; CGRect keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect newTextViewFrame = self.textView.frame; newTextViewFrame.size.height -= keyboardSize.size.height + 70; self.textView.frame = newTextViewFrame; self.textView.backgroundColor = [UIColor yellowColor]; } - (void)keyboardWillHide:(NSNotification *)notification { NSDictionary* info = [notification
  • UITextView的文本长度如何固定?(how text length of a UITextView can be fixed?)
    问题 我有一个UITextView,用户可以在textView中最多写入160个字符。 如何确定UITextView的最大文本长度? 回答1 代替 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 和 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 在这里回答 回答2 此代码块也可用于“复制/粘贴”,但在尝试粘贴会使文本视图超出限制的字符数时也能应付情况。 在这种情况下,仅粘贴字符串的第一个字符。 #define MAX_LENGTH 15 // Whatever your limit is - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { NSUInteger newLength = (textView.text.length -
  • 如何在键盘上添加完成按钮?(How to add Done button to the keyboard?)
    问题 更新: 我还尝试实现UITextViewDelegate委托,然后在控制器中执行以下操作: - (BOOL)textViewShouldEndEditing:(UITextView *)textView { [textView resignFirstResponder]; return YES; } 我还将文本视图的委托设置为self(控制器视图实例)。 单击“完成”按钮仍只插入新行:( 更新: 到目前为止我所做的。 我已经通过我的视图控制器实现了UITextFieldDelegate。 我已经通过出口将文本视图连接到视图控制器。 然后我做了: self.myTextView.delegate = self; 和: - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 但是,当我单击“完成”按钮时,它只会添加一个新行。 因此,我的场景上有一个UITextView元素,当用户点击它时,会出现键盘并且可以对其进行编辑。 但是,我无法关闭键盘。 如何在键盘上添加“完成”按钮,以便将其关闭? 回答1 多数民众赞成很简单:) [textField setReturnKeyType:UIReturnKeyDone]
  • UITextView attributedText和语法突出显示(UITextView attributedText and syntax highlighting)
    问题 背景 因此,在iOS 6中,UITextView可以采用attributedString,这对于语法突出显示很有用。 我在-textView:shouldChangeTextInRange:replacementText:做一些正则表达式模式-textView:shouldChangeTextInRange:replacementText:通常,我需要更改已经键入的单词的颜色。 除了重设attributedText,这没有其他选择,这需要花费时间。 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { //A context will allow us to not call -attributedText on the textView, which is slow. //Keep context up to date [self.context replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:self.textView