Ios 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文档显示它 返回一个新字符串,其中指定范围内的字符为 接收器由给定字符串替换 这看起来很简单。它用您选择的替换项替换了一些字符范围。我可以看到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
textField
有一个名为range
和replacementString
的参数,但是提供了什么范围以及替换的是什么
委托正在使用的主ViewController
不提供其中任何一个。它只是实例化委托并将其应用于相关的textField
让zipCodeDelegate=ZipCodeTextFieldDelegate()
//马克:出口
@IBOutlet弱var textField:UITextField!
//马克:生命周期
重写func viewDidLoad(){
super.viewDidLoad()
self.textField.delegate=self.zipCodeDelegate
}
首先,您应该理解shouldchangeCharacters in
的目的。每当用户试图以某种方式更改文本字段的文本时,文本字段会询问其代表是否“应更改字符”,即是否应允许用户进行他们试图进行的更改
请注意,用户可以通过多种方式更改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的文本未更改。(对不起,“当前文本字段的文本”令人困惑–我指的是“文本字段的当前文本”。)