1,问题描述

有时我们开发的时候需要先把“确认”按钮初始设置为不可用,当文本框中输入文字以后,再将输入按钮变为可用。

2,实现原理
(1)要检测文本框内容的变化,我们需要让新界面的Controller遵循一个文本协议UITextFieldDelegate。
同时在viewDidLoad方法内将文本框的代理设置为MainListController当前实例。
然后实现textFile的shouldChangeCharactersInRange方法就能在文本框将要变化的时候执行一些代码。
 
(2)但这个只是将要变化时执行,而不是变化后。比如在这个方法内打印出文本框的内容,会发现每当我们改变文本框的内容时,打印出来的是上一次的内容。
比如先输入1,打印出来是空。再输入2,文本框上是12,但打印出来却是1.
要获取最新内容,则需要String的stringByReplacingCharactersInRange方法,但这个方法在Swift的String中又不支持。要解决这个问题,就要先替NSRange做个扩展。
3,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import UIKit
 
class ViewController: UIViewController ,UITextFieldDelegate{
 
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var textField: UITextField!
     
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
         
        textField.delegate = self
    }
 
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
        replacementString string: String) -> Bool {
        let newText = textField.text
            .stringByReplacingCharactersInRange(range.toRange(textField.text), withString: string)
        button.enabled = countElements(newText) > 0
        return true
    }
     
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
 
//扩展NSRange,让swift的string能使用stringByReplacingCharactersInRange
extension NSRange {
    func toRange(string: String) -> Range<String.Index> {
        let startIndex = advance(string.startIndex, self.location)
        let endIndex = advance(startIndex, self.length)
        return startIndex..<endIndex
    }
}

Swift - 文本输入框内容改变时响应,并获取最新内容的更多相关文章

  1. input中的内容改变时触发的事件

    input中的内容改变时触发的事件 1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发:onproperty ...

  2. 当input中的内容改变时触发的事件

    当input中的内容改变时触发的事件 1 $('#id').bind('input propertychange', function() { //处理内容 } 循环js事件 $(document). ...

  3. input标签内容改变时触发事件

    1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加 ...

  4. Swift - 文本输入框(UITextField)

    1,文本框的创建,有如下几个样式: UITextBorderStyle.none:无边框 UITextBorderStyle.line:直线边框 UITextBorderStyle.roundedRe ...

  5. Swift - 文本输入框(UITextField)的用法

    1,文本框的创建,有如下几个样式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRe ...

  6. 'input propertychange' 当输入框文字改变时触发的事件!

    $('.amount_input').bind('input propertychange', function() { console.log(2); $('.list label').remove ...

  7. formValidation单个输入框值改变时校验

     $("#tv_form").data("formValidation").updateStatus("pay.vcAmount", &qu ...

  8. jquery文本框内容改变事件

    /** * 内容改变时并不会触发事件,但是在失去焦点的时候会触发. */ $("#inputid").change(function(){ console.log($(this). ...

  9. WTL自定义控件:edit内容改变响应

    头文件内容: BEGIN_MSG_MAP(myEdit) COMMAND_CODE_HANDLER_EX(EN_CHANGE, OnEnChange) END_MSG_MAP()4 void OnEn ...

随机推荐

  1. Qt 5.x 全局热键 for windows

    Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全 ...

  2. hdu1730 Northcott Game,Nim-sum

    题解: 转化成求Nim-sum 每行黑白棋的初始间距作为每堆石子个数 假设当前为P态,则无论当前选手如何操作,下一个选手都能使其操作后的局面又变为P态. Nim-sum = 0,即P态. #inclu ...

  3. Swift 初见

    http://numbbbbb.gitbooks.io/-the-swift-programming-language-/chapter1/02_a_swift_tour.html 本页内容包括: 简 ...

  4. 前端开发工具(安装及常用技巧)——sublime text 3

    安装 官方下载地址:http://www.sublimetext.com Sublime Text 3 一大优势就是跨平台(Windows.Linux.OS X 都有):portable versio ...

  5. MUI跳转页面传值

    1.打开新的页面.通过 mui.openWindow 打开页面extras参数传递参数 mui.openWindow({ id: "yingshou-" + newid, url: ...

  6. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  7. mysql basic operation,mysql总结

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  8. C#:总结页面传值几种方法

    小知识点: 1.  W7自带 .NetFrameWork 3.5, 兼容模式为 高版本号兼容低版本号: 2. WF和WPF都是基于XAML的,可是两者的用途不同. WF是一种开发框架,将工作流嵌入在. ...

  9. Android应用开发经常使用知识

    在其它站点看到的,Mark一下 1.近期打开的应用不在近期任务列表中显示 android:excludeFromRecents="true" 设置为true,则排除在近期任务列表之 ...

  10. 算法练习之DP 求LCM (最长公共子序列)

    1. 对于序列x[1,i]和y[1,j],推导递推公式1.a 假设当前元素同样,那么就将当前最大同样数+12.b 假设当前元素不同.那么就把当前最大同样数"传递"下去 因此递推公式 ...