【问题标题】:Detect backspace in empty UITextField检测空 UITextField 中的退格键
【发布时间】:2010-12-30 23:31:11
【问题描述】:

有没有什么方法可以检测到何时在 iPhone 键盘上按下了 Backspace/Delete 键,UITextField 为空?我想知道只有当UITextField 为空时才按下Backspace


根据@Alex Reynolds 在评论中的建议,我在创建文本字段时添加了以下代码:

[[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selector(handleTextFieldChanged:)
              name:UITextFieldTextDidChangeNotification
            object:searchTextField];

收到此通知(调用handleTextFieldChanged 函数),但当我在空白字段中按 Backspace 键时仍然没有收到。有什么想法吗?


这个问题似乎有些混乱。我想在按下 Backspace 键时收到通知。而已。但是,当UITextField 已经为空时,该解决方案也必须有效。

【问题讨论】:

  • 我认为您的意思可能是“仅当 UITextField 为空时”而不是“仅当键盘为空时”...?
  • @Steve Harrison:谢谢。更新了。
  • 我正在尝试做类似的事情,那么你得到了什么解决方案?我正在做的是滚动视图中的文本字段,当我输入一些文本时,会显示建议,当我单击一个时,标签对象会放置在文本字段的左侧。在此先感谢:D
  • 2011/11 解决方案 使用运行时技巧的空 UITextField:bjhomer.blogspot.com/2011/11/…
  • 荒谬地渴望如此微不足道的事情。这应该不难。

标签: ios iphone uitextfield backspace


【解决方案1】:

斯威夫特 4:


子类UITextField:

// MyTextField.swift
import UIKit

protocol MyTextFieldDelegate: AnyObject {
    func textFieldDidDelete()
}

class MyTextField: UITextField {

    weak var myDelegate: MyTextFieldDelegate?

    override func deleteBackward() {
        super.deleteBackward()
        myDelegate?.textFieldDidDelete()
    }

}

实施:

// ViewController.swift

import UIKit

class ViewController: UIViewController, MyTextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize textField
        let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))

        // set viewController as "myDelegate"
        input.myDelegate = self

        // add textField to view
        view.addSubview(input)

        // focus the text field
        input.becomeFirstResponder()
    }

    func textFieldDidDelete() {
        print("delete")
    }

}

目标-C:


子类UITextField:

//Header
//MyTextField.h

//create delegate protocol
@protocol MyTextFieldDelegate <NSObject>
@optional
- (void)textFieldDidDelete;
@end

@interface MyTextField : UITextField<UIKeyInput>

//create "myDelegate"
@property (nonatomic, assign) id<MyTextFieldDelegate> myDelegate;
@end

//Implementation
#import "MyTextField.h"

@implementation MyTextField

- (void)deleteBackward {
    [super deleteBackward];

    if ([_myDelegate respondsToSelector:@selector(textFieldDidDelete)]){
        [_myDelegate textFieldDidDelete];
    }
}

@end

现在只需将 MyTextFieldDelegate 添加到您的 UIViewController 并将您的 UITextFields myDelegate 设置为 self

//View Controller Header
#import "MyTextField.h"

//add "MyTextFieldDelegate" to you view controller
@interface ViewController : UIViewController <MyTextFieldDelegate>
@end

//View Controller Implementation
- (void)viewDidLoad {
    //initialize your text field
    MyTextField *input = 
     [[MyTextField alloc] initWithFrame:CGRectMake(0, 0, 70, 30)];

    //set your view controller as "myDelegate"
    input.myDelegate = self;

    //add your text field to the view
    [self.view addSubview:input];
}

//MyTextField Delegate
- (void)textFieldDidDelete {
    NSLog(@"delete");
}

【讨论】:

  • 这是最好的解决方案。接受的答案是hack。 Objective C 是基于子类的,这个解决方案正确地使用它来解决问题。
  • 这显然现在在 ios8 中不起作用,因为看起来像是一个 Apple 错误:devforums.apple.com/message/1045312#1045312
  • 我在我的回答中使用了针对 ios8 错误的解决方案并且它有效。它可能对那些正在寻找解决方案的人有用。
  • deleteBackward() 如果你在textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -&gt; Boolreturn false 将不会被调用
  • 我以你的名义捐款。再次感谢!
【解决方案2】:

更新:有关覆盖 -[UITextField deleteBackward] 的示例,请参阅 JacobCaraballo's answer

查看UITextInput,特别是UIKeyInput 有一个deleteBackward delegate method,当按下删除键时总是 会调用它。如果您正在做一些简单的事情,那么您可能会考虑将UILabel 子类化并使其符合UIKeyInput 协议,正如SimpleTextInputiPhone UIKeyInput Example 所做的那样。 注意:UITextInput 及其亲属(包括UIKeyInput)仅适用于 iOS 3.2 及更高版本。

【讨论】:

  • 这是正确的答案。使用 UITextField 的快速子类,它不是 hacky 并且非常简单。
  • 刚刚在下面发现了 Jacob 的回答。它给出了一个详细的例子。
  • 值得注意的是,这个答案在 iOS 5 中不起作用。如果文本字段为空,按退格键不会调用此方法。
【解决方案3】:

这可能是一个长镜头,但它可以工作。尝试将文本字段的文本设置为零宽度空格字符\u200B。当在显示为空的文本字段上按下退格键时,它实际上会删除您的空间。然后你可以重新插入空间。

如果用户设法将插入符号移到空格的左侧,则可能无法正常工作。

【讨论】:

  • @Andrew,这是我决定采用的方法。它需要一些代码,但它肯定是有效的。感谢您的帮助,而不是试图告诉我我做错了什么。
  • 这种技术可能适用于 iPhone > 3.1.3,但它很hacky,可能会在未来的版本中中断,等等。我想我为how to detect a delete keyboard key press on the iPhone/iOS找到了一个更干净、更稳定的解决方案。
  • 我可以确认如果用户设法将光标移动到空间的左侧,则未检测到删除。如果您能弄清楚如何解决这个问题,那么您还应该将UITextField 子类化并实现canPerformAction:withSender:return NO,以便在文本等于字符串@"\u200B" 时执行select:selectAll: 操作。跨度>
  • 问题是这不适用于安全测试字段。任何想法如何处理?
  • 抱歉,这个想法很糟糕。这是令人难以置信的hacky,不应该是30左右赞成票的公认答案。我会将 UITextField 子类化,就像其他一些评论者提到的那样。
【解决方案4】:

代码如下:

@interface MyTextField : UITextField
@end

@implementation MyTextField

- (void)deleteBackward
{
    [super deleteBackward];

    //At here, you can handle backspace key pressed event even the text field is empty
}

@end

最后,别忘了把 Text Field 的 Custom Class 属性改成“MyTextField”

【讨论】:

  • 这应该是公认的答案。干净,实际上回答了问题。
  • 它确实回答了这个问题......只要您的目标是 iOS 6.0+。不幸的是,在 iOS 5 上,您的子类根本没有调用 deleteBackward。
  • BJ Homer,93% 的设备都在 iOS 6 上,所以不针对 iOS 5 通常没什么大不了的。
  • 我很高兴我一直向下滚动到足以找到这个。今天在 IOS 7 中 100% 正确的方法。
  • 对于这个问题,我已经看到了很多其他答案,这些答案只是变通方法,几乎​​没有一个可以处理在空白字段中按下退格键的情况。然而,这是完美的,而且是一种非常干净的方式。
【解决方案5】:

Swift 实现:

import UIKit

// Extend from PinTextFieldDelegate instead of UITextFieldDelegate in your class
protocol PinTextFieldDelegate : UITextFieldDelegate {
    func didPressBackspace(_ textField: PinTextField)
}

class PinTextField: UITextField {

    override func deleteBackward() {
        super.deleteBackward()

        // If conforming to our extension protocol
        if let pinDelegate = self.delegate as? PinTextFieldDelegate {
            pinDelegate.didPressBackspace(self)
        }
    }
}

【讨论】:

  • 谢谢,我可以知道这个方法是苹果推荐的还是它的黑客。文本字段似乎没有记录。
  • 使用 textView 为我工作。感谢分享;)
  • 当文本字段为空并单击退格时为我工作。
  • 对我很有用。谢谢:)
【解决方案6】:

我创建了比subclass 解决方案更容易的其他方式。即使它有点奇怪,但它工作正常。

- (BOOL)textView:(UITextView *)textView 
        shouldChangeTextInRange:(NSRange)range 
        replacementText:(NSString *)text
{
    const char * _char = [text cStringUsingEncoding:NSUTF8StringEncoding];
    int isBackSpace = strcmp(_char, "\b");

    if (isBackSpace == -8) {
       // is backspace
    }

    return YES;
}

比较的结果是-8有点奇怪。也许我会在C Programming 的某些方面出错。但它的正确工作;)

【讨论】:

  • 仰泳未设置 '\b'。但是如果你仔细调试,你会看到'\0'。所以我得到结果 0 ,即 strcmp 方法中的两个值相等。 const char *stoke = [文本 cStringUsingEncoding:NSASCIIStringEncoding]; const char *backstroke = "\0";// 这等于 \b->"\x08"; strcmp(仰泳, 斯托克);
  • 另外,根据 strcmp(s1, s2) 的定义,如果 s1 == s2, > 0 s1 在字典上大于 s2,则返回 0,反之亦然。
  • 我不明白这怎么可能? @YoonLee:你不是说strcmp 会返回-1, 0, or 1 吗?这是我的理解。
  • 在 textview 中,即使没有文本,您总是会检测到退格,UITextField 不同
  • 这是UITextViewDelegate 方法,而不是UITextFieldDelegate
【解决方案7】:

试试delegate

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

然后检查range.length == 1是否是backspace被击中的情况。

【讨论】:

  • 只有在字段非空时调用。注意原来的问题。 :)
【解决方案8】:

请使用以下代码,即使您的文本字段为空,它也会帮助您检测键盘删除键。

目标 C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }

斯威夫特:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { return true }

【讨论】:

  • Tx - 正是我所需要的。但它记录在哪里??
【解决方案9】:

Niklas Alvaeus 的回答帮助我解决了类似的问题

我限制了对特定字符集的输入,但它忽略了退格。 所以我让它在修剪NSString之前检查range.length == 1。如果是真的,我只返回字符串而不修剪它。见下文

 - (BOOL) textField:(UITextField *)textField 
          shouldChangeCharactersInRange:(NSRange)range 
          replacementString:(NSString *)string
 {
     NSCharacterSet *nonNumberSet = 
      [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] 
         invertedSet];

    if (range.length == 1) {
       return string;
    }
    else {
       return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }   
 }

【讨论】:

  • 该方法需要一个布尔值而不是字符串作为返回值
【解决方案10】:

对于那些对Jacob's answer 有问题的人,我实现了我的文本字段子类,如下所示,效果很好!

#import <UIKit/UIKit.h>

@class HTTextField;

@protocol HTBackspaceDelegate <NSObject>

@optional
- (void)textFieldDidBackspace:(HTTextField*)textField;
@end

@interface HTTextField : UITextField<UIKeyInput>

@property (nonatomic, assign) id<HTBackspaceDelegate> backspaceDelegate;

@end


#import "HTTextField.h"

@implementation HTTextField

- (void)deleteBackward {
    [super deleteBackward];
    if ([self.backspaceDelegate respondsToSelector:@selector(textFieldDidBackspace:)]){
        [self.backspaceDelegate textFieldDidBackspace:self];
    }
}

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
    BOOL shouldDelete = YES;

    if ([UITextField instancesRespondToSelector:_cmd]) {
        BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd];

        if (keyboardInputShouldDelete) {
            shouldDelete = keyboardInputShouldDelete(self, _cmd, textField);
        }
    }

    if (![textField.text length] && [[[UIDevice currentDevice] systemVersion] intValue] >= 8) {
        [self deleteBackward];
    }

    return shouldDelete;
}

@end

【讨论】:

  • 你能写出swift的代码吗?我收到一些错误“对 protoco uikeyinput 的冗余确认”
【解决方案11】:

是的,当 textField 为空时,使用下面的方法检测退格。

需要添加UITextFieldDelegate

yourTextField.delegate = self (必须要求)

斯威夫特:

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { 
    return true
}

目标 C:

- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { 
    return YES; 
}

【讨论】:

  • 这甚至不需要我。当事件发生时,所有其他委托方法都会被调用。
  • 谢谢你,伙计。你搞定了。:)
  • @McDonal_11 我想你忘了设置 textfield.delegate = self of textfield。
  • 我已经设置好了。其他 UITextField 的委托方法工作正常。仅此一个不起作用。我想念什么??
【解决方案12】:

我发现检测退格的最佳用途是检测用户何时在空的UITextField 中按下退格。例如,如果您在邮件应用中有“冒泡”收件人,当您在UITextField 中按退格键时,它会选择最后一个“冒泡”收件人。

这可以通过与 Jacob Caraballo 的回答类似的方式完成。但在 Jacob 的回答中,如果在您按下退格键时 UITextField 还剩一个字符,则在收到委托消息时,UITextField 已经为空,因此您在文本字段中有效地检测到 backspace最多有一个字符。

实际上,如果您想在 UITextField 上检测到具有正好零个字符(空)的 backspace,那么您应该在调用 super deleteBackward 之前将消息发送到 delegate。例如:

#import "MyTextField.h"

//Text field that detects when backspace is hit with empty text
@implementation MyTextField

#pragma mark - UIKeyInput protocol
-(void)deleteBackward
{
  BOOL isTextFieldEmpty = (self.text.length == 0);
  if (isTextFieldEmpty) {
    if ([self.delegate 
         respondsToSelector:@selector(textFieldDidHitBackspaceWithEmptyText:)]) {

        [self.delegate textFieldDidHitBackspaceWithEmptyText:self];
        }
    }
    [super deleteBackward];
}
@end

此类文本字段的界面如下所示:

@protocol MyTextFieldDelegate;

@interface MyTextField : UITextField
@property(nonatomic, weak) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
-(void)textFieldDidHitBackspaceWithEmptyText:(MyTextField *)textField;
@end

【讨论】:

【解决方案13】:

在 iOS 6 中,当按下退格键时,会在 UITextField 上调用 deleteBackward 方法,包括当字段为空时。所以你可以继承 UITextField 并提供你自己的 deleteBackward 实现(也可以调用 super)。

我仍然支持 iOS 5,所以我需要 Andrew 的回答和这个的结合。

【讨论】:

    【解决方案14】:

    :) 仅用于标题“检测退格”,我使用UIKeyboardTypeNumberPad

    今晚我也遇到了同样的问题,下面是我的代码:

    - (BOOL)textField:(UITextField *)textField 
            shouldChangeCharactersInRange:(NSRange)range 
            replacementString:(NSString *)string
    {
        NSLog([NSString stringWithFormat:@"%d", [string length]]);
    }
    

    因为UIKeyboardTypeNumberPad,用户只能输入数字或退格,所以当字符串长度为0时,必须是退格键。

    希望以上内容能有所帮助。

    【讨论】:

    • 任何键盘类型都一样。
    • 如何将此方法连接到我的文本字段?
    【解决方案15】:

    与其尝试预先构造文本字段中的内容或找出在 shouldChangeCharactersInRange 方法中输入的特殊字符,我建议执行以下操作:

    [self performSelector:@selector(manageSearchResultsDisplay) 
               withObject:nil 
               afterDelay:0];
    

    这允许您在当前操作完成后直接调用方法。这很酷的是,当它完成时,修改后的值已经在UITextField 中。此时,您只需检查它的长度和/或根据那里的内容进行验证。

    【讨论】:

      【解决方案16】:

      子类化 UITextField 在 iOS 8.3 上对我不起作用,deleteBackward 从未被调用过。

      这是我使用的解决方案,适用于所有 iOS 8 版本,也应该适用于其他 iOS 版本

      for textField in textFields {
                  textField.text = " "
      }
      
      func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
              if string == "" && textField.text == " "   {
                  // Do stuff here
                  return false
              }
              return true
      }
      

      【讨论】:

        【解决方案17】:

        在 .h 文件中添加 UIKeyInput 委托

        - (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
        
        if ([textField isEqual:_txtFirstDigit]) {
        
        }else if([textField isEqual:_txtSecondDigit]) {
            [_txtFirstDigit becomeFirstResponder];
        
        }else if([textField isEqual:_txtThirdDigit]) {
            [_txtSecondDigit becomeFirstResponder];
        
        }else if([textField isEqual:_txtFourthDigit]) {
            [_txtThirdDigit becomeFirstResponder];
        }
        return YES;
        }   
        

        改进的格式

        【讨论】:

          【解决方案18】:

          我已经实现了类似的解决方案,并进行了一些小的改进,它会告诉我在用户点击退格键时文本字段是否有任何值。如果按下退格键时文本字段为空,我应该只关注另一个文本字段,这对我的情况很有用。

          protocol MyTextFieldDelegate : UITextFieldDelegate {
              func textFieldDidDelete(textField: MyTextField, hasValue: Bool)
          }
          
          override func deleteBackward() {
              let currentText = self.text ?? ""
              super.deleteBackward()
              let hasValue = currentText.isEmpty ? false : true
              if let delegate = self.delegate as? MyTextFieldDelegate {
                  delegate.textFieldDidDelete(textField: self, hasValue: hasValue)
              }
          }
          

          【讨论】:

            【解决方案19】:

            The most poplar answer 缺少一件事——检测文本字段是否为空的能力。

            也就是说,当你重写 TextField 子类的 deleteBackwards() 方法时,你仍然不知道文本字段是否已经为空。 (deleteBackwards()之前和之后,textField.text!都是空字符串:""

            这是我的改进,在删除之前检查是否为空。

            1。创建一个扩展 UITextFieldDelegate 的委托协议

            protocol MyTextFieldDelegate: UITextFieldDelegate {
                func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool)
            }
            

            2。子类 UITextField

            class MyTextField: UITextField {
                override func deleteBackward() {
                    // see if text was empty
                    let wasEmpty = text == nil || text! == ""
            
                    // then perform normal behavior
                    super.deleteBackward()
            
                    // now, notify delegate (if existent)
                    (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
                }
            }
            

            3。实现您的新委托协议

            extension MyViewController: MyTextFieldDelegate {
                func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
                    if wasEmpty {
                        // do what you want here...
                    }
                }
            }
            

            【讨论】:

              【解决方案20】:

              Swift 5.1 的单个数字文本字段的综合处理程序:

              • 假设您有 textFields 的出口集合(也有连接的代表)

              1 步

              protocol MyTextFieldDelegate: class {
                  func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) 
              }
              
              final class MyTextField: UITextField {
              
                  weak var myDelegate: MyTextFieldDelegate?
              
                  override func deleteBackward() {
                      let wasEmpty = text == nil || text == ""
              
                      // then perform normal behavior
                      super.deleteBackward()
              
                      // now, notify delegate (if existent)
                      (delegate as? MyTextFieldDelegate)?.textField(self, didDeleteBackwardAnd: wasEmpty)
                  }
              }
              

              2 步

              final class ViewController: UIViewController {
              
                  @IBOutlet private var textFields: [MyTextField]!
              
                  override func viewDidLoad() {
                      super.viewDidLoad()
                      textFields.forEach {
                          $0.delegate = self
                          $0.myDelegate = self
                      }
                  }
              }
              

              3 步

              extension ViewController: UITextFieldDelegate, MyTextFieldDelegate {
                  func textFieldHasChanged(with text: String, _ tag: Int, for textField: UITextField) {
                      textField.text = text
              
                      if let someTextField = (textFields.filter { $0.tag == tag }).first {
                          someTextField.becomeFirstResponder()
                      } else {
                          view.endEditing(true)
                      }
                  }
              
                  func textField(_ textField: UITextField, didDeleteBackwardAnd wasEmpty: Bool) {
                      // If the user was pressing backward and the value was empty, go to previous textField
                      textFieldHasChanged(with: "", textField.tag - 1, for: textField)
                  }
              
                  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                      // Restrict to only digits
                      let aSet = NSCharacterSet(charactersIn: "0123456789").inverted
                      let compSepByCharInSet = string.components(separatedBy: aSet)
                      let numberFiltered = compSepByCharInSet.joined(separator: "")
              
                      guard string == numberFiltered, let text = textField.text else { return false }
              
                      if text.count >= 1 && string.isEmpty {
                          // If the user is deleting the value
                          textFieldHasChanged(with: "", textField.tag - 1, for: textField)
                      } else {
                          textFieldHasChanged(with: string, textField.tag + 1, for: textField)
                      }
              
                      return false
                  }
              }
              

              【讨论】:

                【解决方案21】:

                这是我基于@andrew 想法的解决方案:

                某处,例如在 viewDidLoad 中

                        textField.delegate = self
                        textField.addTarget(self, action: #selector(valueChanged(_:)), for: .editingDidBegin)
                

                然后

                    @objc func valueChanged(_ textField: UITextField) {
                        textField.text = "\u{200B}"
                    }
                
                    override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                        textField.text = string
                        if string == "" {
                            //backpaspace pressed 
                        }
                

                【讨论】:

                  【解决方案22】:

                  所有的答案都非常有帮助,我不知道为什么每个人都在走协议路线。你可以用更少的代码和回调函数来做到这一点-

                  Swift 5.0 或更高版本

                  1. 创建一个自定义文本字段类扩展 UITextField 并覆盖 deleteBackward 函数-

                    类 CustomTextField: UITextField {

                     var backButtonPressedInEmptyTextField: (()->())?
                    
                     override func deleteBackward() {
                         super.deleteBackward()
                         if let text = self.text, text.count == 0{
                             backButtonPressedInEmptyTextField?()
                             print("Back space clicked when textfield is empty")
                         }
                     }
                    

                    }

                  2. 假设你想在你的 ViewController MyViewController 中做一些基于它的事情。因此,在MyViewController 中,只需执行以下操作-

                    类 MyViewController: UIViewController{ @IBOutlet weak var sampleTextField: CustomTextField!{ 设置{ sampleTextField.backButtonPressedInEmptyTextField = backButtonPressed() } }

                     func backButtonPressed(){
                         //do whatever you want
                     }
                    

                    }

                  感觉用闭包或者回调函数,干净多了。

                  【讨论】:

                    【解决方案23】:

                    类似这样的:

                    - (BOOL)textField:(UITextField *)textField 
                            shouldChangeCharactersInRange:(NSRange)range 
                            replacementString:(NSString *)string       
                    {  
                        if (![text hash] && ![textField.text length])  
                            [self backspaceInEmptyTextField];  
                    }
                    

                    当然,哈希是针对一个字符串的。

                    【讨论】:

                      【解决方案24】:

                      使用 TextField 委托方法:

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

                      在上面的方法中添加以下代码来检测删除事件

                      if(textField == YourTextField)
                      {
                          if ([string length] == 0 && range.length > 0)
                          {
                              // Your Code after deletion of character
                          }
                      }
                      

                      【讨论】:

                        【解决方案25】:
                        + (BOOL)detectBackspaceOnly:(NSString *)string
                        {
                            for(int i=0 ; i<string.length ; i++){
                                unichar caract = [string characterAtIndex:i];
                                if(caract != ' ' && caract != '\n')
                                    return NO;
                            }
                        
                            return YES;
                        }
                        

                        【讨论】:

                        • 也许可以稍微解释一下把这个放在哪里?
                        【解决方案26】:

                        您可以检查文本视图/字段的文本以查看其是否为空,并确保在 shouldChangeTextIn 委托方法中替换文本也为空。

                        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
                            if (textView.text == "" && text == "") {
                                print("Backspace on empty text field.")
                            }
                            return true
                        }
                        

                        【讨论】:

                          【解决方案27】:

                          保持简单,这是您需要检查的唯一条件

                               if (range.length==1)
                          

                          【讨论】:

                            【解决方案28】:

                            UITextViewDelegate:

                            - (BOOL)               textView:(UITextView *)textView 
                                    shouldChangeTextInRange:(NSRange)range 
                                            replacementText:(NSString *)text
                            {
                                if(text isEqualToString:@"");
                                {
                                    NSLog(@"press backspace.");
                                }
                            }
                            

                            对我来说没问题。

                            中文简体拼音和中文手写输入更新:

                            - (BOOL)               textView:(UITextView *)textView 
                                    shouldChangeTextInRange:(NSRange)range 
                                            replacementText:(NSString *)text
                            {
                                if (range.length > 0 && [text isEqualToString:@""]) {
                                    NSLog(@"press Backspace.");
                                }
                                return YES;
                            }
                            

                            根据文件说:

                            “如果用户按下deleteKey,则范围的长度为1,并且一个空字符串对象替换该单个字符。”

                            【讨论】:

                            • 这个问题是关于UITextField,而不是UITextView
                            猜你喜欢
                            • 2012-11-18
                            • 1970-01-01
                            • 2011-05-20
                            • 2015-06-12
                            • 2019-02-07
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2023-03-13
                            相关资源
                            最近更新 更多