有时我们开发的时候需要先把“确认”按钮初始设置为不可用,当文本框中输入文字以后,再将输入按钮变为可用。
2,实现原理
(1)要检测文本框内容的变化,我们需要让新界面的Controller遵循一个文本协议
UITextFieldDelegate。
同时在
viewDidLoad方法内将文本框的代理设置为当前实例。
比如先输入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
}
}
|
@H_403_463@1.将
原文链接:https://www.f2er.com/swift/324527.htmlString
转化为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
@H_403_463@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
@H_403_463@通过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>
}