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

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

    }

}

时间: 2024-10-26 01:57:46

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

Jquery内容改变时触发事件

<div class="t_input"> <label>¥</label> <input type="text" name="" class="t_num" id="t_use"> <span class="place_span">可提现金额:¥9,995.23</span> </div> input里

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

onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加或删除一个字符就会触发,通过js改变也会触发该事件,但是该事件是IE专有. oninput事件是IE之外的大多数浏览器支持的事件,在value改变时实时触发,但是通过js改变value时不会触发:基本写原生常用的是oninput. oninput与onpropertychange失效的情况: oninput事件: 1.当脚本中改变value时,不会触发: 2.从浏览器的自

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

1,文本框的创建,有如下几个样式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRect:圆角矩形边框 UITextBorderStyle.Bezel:边线+阴影 1 2 3 4 var textField = UITextField(frame: CGRectMake(10,160,200,30)) //设置边框样式为圆角矩形 textField.borderStyle = UI

EditText 使用细节(输入内容改变时的监听事件、透明背景、修改提示文字颜色、输入内容密文显示)

1.对EditText的输入内容进行监听,给EditText 绑定 addTextChangedListener 监听事件 即可. 2.EditText输入内容,密文显示: android:password="true" 3.将EditText边框设置成透明的: android:background="#00000000" 4.修改EditText中hint文字颜色: android:textColorHint="#ffffff" 很多时候,我们

当UITextField内容改变时获取值

[textField addTarget:selfaction:@selector(textFieldTextDidChange)forControlEvents:UIControlEventEditingChanged]; -(void)textFieldDidChange { NSLog(@"%@",textField.text); }

jquery文本框内容改变事件

/** * 内容改变时并不会触发事件,但是在失去焦点的时候会触发. */ $("#inputid").change(function(){ console.log($(this).val()); }); /** * 只要文本类容发生改变,就会触发该事件 */ $("#inputid").bind("input propertychange",function(){ console.log($(this).val()); });

关于Input内容改变的触发事件

1.onchange onchange 事件会在域的内容改变时触发.支持的标签<input type="text">, <textarea>, <select>,<keygen>. 注意:在元素的值改变了且失去焦点时触发(两次的值一样不会触发). 缺陷:通过js代码改变DOM的值不会触发,解决在js代码里改值了调用其change 的function() 或者调.change()方法. JS: 1 <input type="

input 内容改变的触发事件

1. onchange onchange 事件会在域的内容改变时触发.支持的标签<input type="text">, <textarea>, <select>,<keygen>. 注意:在元素的值改变了且失去焦点时触发(两次的值一样不会触发). 缺陷:通过js代码改变DOM的值不会触发,解决在js代码里改值了调用其change 的function() 或者调.change()方法. JS: <input type="t

flex布局下, 内容改变 不重新渲染问题

当使用flex布局时,flex内元素包含的内容改变时,浏览器不会进行重新渲染, 答案引用 http://stackoverflow.com/questions/23474191/flexbox-height-not-updating-when-content-changes 主要CSS .prelative {     position:relative; } div:before { content:attr(class); left:-9999px; position:absolute; }