加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift - 文本输入框内容改变时响应,并获取最新内容

发布时间:2020-12-14 07:14:46 所属栏目:百科 来源:网络整理
导读:1,问题描述 有时我们开发的时候需要先把“确认”按钮初始设置为不可用,当文本框中输入文字以后,再将输入按钮变为可用。 2,实现原理 (1)要检测文本框内容的变化,我们需要让新界面的Controller遵循一个文本协议 UITextFieldDelegate 。 同时在 viewDidL
1,问题描述
有时我们开发的时候需要先把“确认”按钮初始设置为不可用,当文本框中输入文字以后,再将输入按钮变为可用。

2,实现原理
(1)要检测文本框内容的变化,我们需要让新界面的Controller遵循一个文本协议 UITextFieldDelegate
同时在 viewDidLoad方法内将文本框的代理设置为当前实例。
然后实现 textFileshouldChangeCharactersInRange方法就能在文本框将要变化的时候执行一些代码。

(2)但这个只是将要变化时执行,而不是变化后。比如在这个方法内打印出文本框的内容,会发现每当我们改变文本框的内容时,打印出来的是上一次的内容。
比如先输入1,打印出来是空。再输入2,文本框上是12,但打印出来却是1.
要获取最新内容,则需要String的 stringByReplacingCharactersInRange方法,但这个方法在Swift的String中又不支持。要解决这个问题,就要先替 NSRange做个扩展。

3,代码如下
import UIKit
class ViewController : UIViewController , UITextFieldDelegate {
@IBOutlet weak var button: UIButton !
textField: UITextField !
override func viewDidLoad() {
super .viewDidLoad()
textField.delegate = self
}
textField(textField: NSRange replacementString string: String ) -> Bool {
let newText = textField.text!.stringByReplacingCharactersInRange(
range.toRange(textField.text!),withString: string)
button.enabled = newText.characters.count > 0
return true
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}
//扩展NSRange,让swift的string能使用stringByReplacingCharactersInRange
extension {
toRange(string: Range < . Index > {
startIndex = string.startIndex.advancedBy( self .location)
endIndex = startIndex.advancedBy( .length)
startIndex..<endIndex
}
}


1.将String转化为NSString再截取,代码如下:

var s="1234567890"

var ns1=(s as NSString).substringFromIndex(5)
var ns2=(s NSString).substringToIndex(4)

var ns3=(s NSString).substringWithRange(NSMakeRange(4,1))

println(ns1)//67890
println(ns2)//1234
println(ns3)//5

2.直接调用String的对应方法(推荐使用该方法),由于String对应的方法参数是String.Index类型而非Int类型,所以我们首先要创建String.Index类型参数值,204)">// var s="1234567890" // let index = advance(s.startIndex,5) swift 1.x //let index2 = advance(s.endIndex,-6); swift 1.x let index = s.startIndex.advancedBy(5) //swift 2.0+ let index2 = s.endIndex.advancedBy(-6) var range = Range<String.Index>(start: index2,end: index) var s1:String=s.substringFromIndex(index) var s2:String=s.substringToIndex(index2) var s3=s.substringWithRange(range) print(s1)print(s2)print(s3)//5 // 扩展String extension String { subscript (r: Int>) -> String { get { let startIndex = self.startIndex.advancedBy(r.startIndex) let endIndex = self.startIndex.advancedBy(r.endIndex) return self[Range(start: startIndex,end: endIndex)] } } } var s4 = s[2...4] print(s4);//345

通过String定义可以看出属性Index是个结构体,具体代码如下:

String : CollectionType {
    struct Index : BidirectionalIndexType,Comparable,153)">Reflectable {
        func successor() -> Index
        func predecessor() -> func getMirror() -> MirrorType
    }
    var startIndex: Index { get }
    var endIndex: subscript (i: Index) -> Character { get }
    func generate() -> IndexingGenerator<String>
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读