Ios ReplacingCharacter如何在代理中工作?

Ios ReplacingCharacter如何在代理中工作?,ios,swift,delegates,Ios,Swift,Delegates,我是Swift的新手,正在学习学员: 类ZipCodeTextFieldDelegate:NSObject,UITextFieldDelegate{ func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{ var newText=textField.text!作为NSString newText=newText.replacingCharacter

我是Swift的新手,正在学习学员:

类ZipCodeTextFieldDelegate:NSObject,UITextFieldDelegate{ func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{ var newText=textField.text!作为NSString newText=newText.replacingCharacters(in:range,with:string)作为NSString//此行 返回newText.length Bool{ textField.resignFirstResponder()辞职 返回true; } } 这基本上是一个将字符数限制在5以内的委托。但是,我不太确定这个方法在这个函数中扮演什么角色。Apple文档显示它

返回一个新字符串,其中指定范围内的字符为 接收器由给定字符串替换

这看起来很简单。它用您选择的替换项替换了一些字符范围。我可以看到
textField
有一个名为
range
replacementString
的参数,但是提供了什么范围以及替换的是什么

委托正在使用的主
ViewController
不提供其中任何一个。它只是实例化委托并将其应用于相关的
textField

让zipCodeDelegate=ZipCodeTextFieldDelegate()
//马克:出口
@IBOutlet弱var textField:UITextField!
//马克:生命周期
重写func viewDidLoad(){
super.viewDidLoad()
self.textField.delegate=self.zipCodeDelegate
}

首先,您应该理解
shouldchangeCharacters in
的目的。每当用户试图以某种方式更改文本字段的文本时,文本字段会询问其代表是否“应更改字符”,即是否应允许用户进行他们试图进行的更改

请注意,用户可以通过多种方式更改textfield的文本,而不仅仅是“输入单个字符”。以下是可能的方式列表(您可能会想到其他方式):

  • 输入单个字符,或粘贴一些文本
  • 删除单个字符
  • 选择一系列字符,然后将其删除
  • 选择一个字符范围,然后输入单个字符,或粘贴一些文本。这将用单个字符或粘贴的文本替换所选范围
  • 请注意,所有这些方法都只是方法4的特例。在所有这些方法中,您只是用一些新文本替换textfield文本中的一个范围。让我重写前3种方法:

  • 将某个位置的零长度范围替换为单个字符或某些粘贴的文本
  • 将textfield的一个长度范围替换为空字符串
  • 用空字符串替换textfield的某些范围
  • 当用户试图以任何方式更改textfield的文本时,textfield将发出类似以下的调用:

    delegate?.textField(self, shouldChangeCharactersIn: someRange, replacementString: someString)
    
    现在,您应该了解参数
    someRange
    someString
    的用途。无论用户如何更改文本,都可以将其建模为“用其他文本(
    someString
    )替换一个文本范围(
    someRange
    )”

    那又是什么呢

    newText.replacingCharacters(in: range, with: string)
    
    是吗

    它只是执行前面提到的替换。回想一下,此委托方法是一个textfield,它询问您“是否允许此更改(建模为范围和替换字符串)”,为了确定是否允许,您尝试先进行更改。如果更改后,文本字段的文本长度最多为5,则允许此更改

    该行尝试进行更改


    当然,在进行此更改时,您并没有更改文本字段的文本,这就是为什么您将其分配给名为
    newText

    的变量。您好,对不起,我离开了一段时间。当您问“是否仍应传递范围和替换项?”时,我不完全确定您的意思。因为是,当前选定文本的范围始终传递给委托方法中的
    shouldchangeCharacters,并且替换字符串也始终传入。至于
    replacingCharacters
    函数,所做的只是在textfield中获取当前文本,并将文本范围替换为e替换字符串,以查看如果从该方法返回true,新字符串将是什么。啊,我明白了。是的,
    范围
    参数表示文本字段当前文本范围内的范围。因此,假设文本字段中的文本为“Hello world!”,用户选择“world”,然后点击“A”键盘上的键–然后将调用
    shouldChangeCharacters in
    ,并且
    范围将等于
    NSRange(位置:6,长度:5)
    (因为“w”的位置位于整个字符串的索引6处,而所选文本的长度为5,因为
    “world”
    有5个字符)而
    replacementString
    将是
    “A”
    。然后,
    replacingCharacters
    用于局部变量(当前文本字段文本的副本)如果要从此委托方法返回true,则获取新文本的内容。执行此操作的目的是查看新文本长度是否小于或等于5。如果为true,则返回
    true
    ,并且文本字段允许进行字符串替换。如果返回
    false
    ,则返回文本字段d的文本未更改。(对不起,“当前文本字段的文本”令人困惑–我指的是“文本字段的当前文本”。)