您的位置:首页 > 移动开发 > Swift

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

2016-02-27 14:11 483 查看
1,问题描述
有时我们开发的时候需要先把“确认”按钮初始设置为不可用,当文本框中输入文字以后,再将输入按钮变为可用。

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

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

3,代码如下


swift中字符串截取方法(substring)

下面介绍2种swift的字符串截取方法,实际上用到了
substringFromIndex
,
substringToIndex
,
substringWithRange


1.将
String
转化为
NSString
再截取,代码如下:
var s="1234567890"

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

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

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

2.直接调用
String
的对应方法(推荐使用该方法),由于
String
对应的方法参数是
String.Index
类型而非
Int
类型,所以我们首先要创建
String.Index
类型参数值,代码如下:
// var s="1234567890"

// let index = advance(s.startIndex, 5)  swift 1.x
//let index2 = advance(s.endIndex, -6); swift 1.x

var s="1234567890"

let index = s.startIndex.advancedBy(5) //swift 2.0+
let index2 = s.endIndex.advancedBy(-6) //swift 2.0+
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)//67890
print(s2)//1234
print(s3)//5

// 扩展String

extension String {
subscript (r: Range<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
是个结构体,具体代码如下:
extension String : CollectionType {
struct Index : BidirectionalIndexType, Comparable, Reflectable {
func successor() -> String.Index
func predecessor() -> String.Index
func getMirror() -> MirrorType
}
var startIndex: String.Index { get }
var endIndex: String.Index { get }
subscript (i: String.Index) -> Character { get }
func generate() -> IndexingGenerator<String>
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: