textFiled解析

UITextField属性和方法


//    快捷键:command +k 弹起/收起模拟器上的键盘
    override func viewDidLoad() {
        super.viewDidLoad()
        
//        UITextField:UIControl:UIViewControl
//  ==================      UIView的属性和方法====================
//       1. 创建UITextField对象
     let textField = UITextField.init(frame: CGRectMake(100, 100, 200, 50))
//        2.添加到界面
        self.view.addSubview(textField)
//        3.设置背景颜色
        textField.backgroundColor = UIColor.greenColor()
        
        
//        再创建一个UITextField对象
        let textField2 = UITextField.init(frame: CGRectMake(100, 200, 200, 50))
        //        2.添加到界面
        self.view.addSubview(textField2)
        //        3.设置背景颜色
        textField2.backgroundColor = UIColor.greenColor()
        
        
//        ==========textField的专有属性和方法==================
//        (1)文字相关
//        1.text属性
//        设置文本输入框的内容
        textField.text = ""
//        拿到文本输入框的内容
        print(textField.text)
        
//        2.文字颜色
        textField.textColor = UIColor.brownColor()
//        3.设置字体
       
        textField.font = UIFont.systemFontOfSize(20, weight: 10)
        
//        4.设置占位文字(在输入框内容为空的时候会显示出来) placeholder占位符
        textField.placeholder = "请输入账号"
        
//        5.文本的对齐方式(默认:左对齐)
         textField.textAlignment = .Left
        
//        6.秘文显示(默认是false)
//        textField.secureTextEntry = true
        
//        (2)显示相关
//        1.设置文本框的样式
        textField.borderStyle = .RoundedRect
        
//        2.设置清除按钮模式(清除按钮实际是右视图)
//        (前提是输入框中有文字)
//        Always -> 一直显示
//        Never ->从不显示
//        WhileEditing ->当文本输入框处于编辑状态的时候才显示
//        UnlessEditing -> 当文本输入框处于非编辑状态的时候才显示
//        注:当文本输入框中有光标的时候处于编辑状态
        textField.clearButtonMode = .Always
        
//        3.左视图
        let leftImageView = UIImageView.init(frame: CGRectMake(0, 0, 50, 50))
        leftImageView.image = UIImage.init(named: "luffy1")
//        设置左视图
//        ******具有父类型的对象可以用于当子类型的对象的引用
        textField.leftView = leftImageView
//        设置左视图的显示模式(确定什么时候显示,默认是从不显上)
        textField.leftViewMode = .Always
        
        
//        4.右视图
//        当右视图显示的时候,清除按钮不能显示
//        let rightLabel = UILabel.init(frame: CGRectMake(0, 0, 40, 40))
//        rightLabel.text = "你好"
//        textField.rightView = rightLabel
//        textField.rightViewMode = .Always
   
//        (3)键盘相关
//          1.设置键盘上返回按钮的样式
        textField.returnKeyType = .Search
//          2.键盘样式
        textField.keyboardType = .Default
        
//          3.设置自定义的键盘
//        自定义的键盘只有高度有效。宽度是屏幕的宽度,他自己会计算
//        let inputView = UIView.init(frame: CGRectMake(0, 0, 0, 256))
//        inputView.backgroundColor = UIColor.redColor()
//        textField.inputView = inputView

        //   4.设置子键盘
        let accessoryView = UIView.init(frame: CGRectMake(0, 0, 0, 50))
        accessoryView.backgroundColor = UIColor.greenColor()
        textField.inputAccessoryView = accessoryView
    
//    (4)设置代理
//        textField ->委托
//        self ->代理

       textField.delegate = self //会自动调用的方法不需要你写调用只需要创建好对象就好了
        
        textField2.delegate = self
        
//        textField2.leftView = UIButton.init(frame: CGRectMake(0, 0, 40, 40))
//        textField2.leftView?.backgroundColor = UIColor.blackColor()
//        textField2.leftViewMode = .Always

    }
    
}

//MARK: - UITextField Delegate
extension ViewController: UITextFieldDelegate {

//    6.当按键盘上的返回按钮的时候,会自动调用
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        print("返回按钮被点击")
//        收起键盘(结束编辑)3种方式
//        1.放弃第一响应者
//        textField.resignFirstResponder()
//        2.直接让指定的textField结束编辑
//        textField.endEditing(true)
//        3.让shelf.view上的所有子视图都结束编辑
        self.view.endEditing(true)
        
        return true
    }
    
    
    
    
    //5.当点击textField弹出来的键盘上的按钮的时候会自动调用这个方法
//    参数1:委托
//    参数2:当前输入的字符所在的位置
//    参数3:当前输入的字符串(在键盘上按的键的值)
//    返回值:是否可以改变texField的text属性() false-> 按钮键盘上的按键无效
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        
        print(range)
        print(string)
       
        if string >= "1" {
         print("进入秘密页面")
        }
         return true
    }
    
    
//   2. 当文本输入框已经开始编辑时会自动调用
    func textFieldDidBeginEditing(textField: UITextField) {
        print("已经开始编辑")
    }
    
//3.当文本输入框将要结束编辑的时候会自动调用这个方法
//    返回:设置当前的textField是否可以结束编辑(默认是true)
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
         print("将要结束编辑")
        if textField.text?.characters.count >= 1 {
            return true
        }
        
       
        return false
    }
    
    
    
//    4.当前文本输入框已经结束编辑的时候会自动调用这个方法
    func textFieldDidEndEditing(textField: UITextField) {
        print("已经结束编辑")
    }
    
//    在textField将要开始编辑的时候会自动调用
    //    参数1:当前这个协议对应的委托
//    返回值:设置当前的textField是否可以进行编辑(默认是true)
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        print("将要开始编辑")
        return true //false ->让textField不能进行编辑
        
    }
}

##自定义键盘

类:

```swift
import UIKit

// MARK:- YTKeyBoard协议
protocol YTKeyBoardDelegate {
    
//    让代理去显示指定的按钮上的内容
    func showContent(button:UIButton)
}



// 1.在创建当前类的对象的时候,去创建这个视图上所有的子视图,并且添加(不需要设置子视图的frame)

//计算子视图的frame
class YTKeyBoard: UIView {

    //    代理
    var delegate: YTKeyBoardDelegate? = nil
//    重写父类的构造方法
    override init(frame: CGRect) {
        super.init(frame: frame)
    
//  在这个构造方法去创建所有的子视图
        self.creatSubviews()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

// MARK:-创建子视图
extension YTKeyBoard {
    
//    计算子视图的frame
//    1.这个方法第一次调用是在当前视图将要显示在界面上的时候才会调用(这个方法中拿到的当前视图的frame是视图最终的frame值)
//    当当前视图显示出来之后,若果视图frame发生改变,就会自动调用这个方法
    override func layoutSubviews() {
        super.layoutSubviews()
//      间距
        let margin:CGFloat = 10
//      宽度
        let keyW = self.frame.size.width
//        高度
        let keyH  = self.frame.size.height
        //        列数
        let col:CGFloat = 3
//        按键的宽度
        let btnW = (keyW - (col + 1) * margin) / col
//      行数
        let line:CGFloat = 4
        //        按键的高度
        let btnH = (keyH - (line + 1) * margin) / line
        
        
//        Y: margin+(btnH+margin)*(i/col)
//        X: margin+(btnW+margin)*(i%col)
//        拿到当前视图上的所有的子视图
        var i = 0
        for value in self.subviews {
            
//            找到按键对应的按钮
            if value.tag == 100 {
                let btnX = margin + (margin + btnW) * CGFloat(i%Int(col))
                let btnY = margin + (margin + btnH) * CGFloat(i/Int(col))
                
                value.frame = CGRectMake(btnX, btnY, btnW, btnH)
//                找到一个按钮i+1
                i += 1
            }
            
            
//            计算imageView 的frame
            if value.tag == 200 {
                value.frame = CGRectMake(20, -40, 50, 50)
            }
            
        }
        
        
      
    }
    
    
//    创建子视图
    func creatSubviews() {
//        键盘上显示的内容
        let titles = ["1","2","3","4","5","6","7","8","9","C","0","返回"]
        
        
//        便历数组,创建对应的按钮
        
        for (_,value) in titles.enumerate() {
            
//            创建对应的按钮
            let btn = UIButton.init()
            btn.setTitle(value, forState: .Normal)
           
            btn.backgroundColor = UIColor.greenColor()
            btn.tag = 100
            btn.addTarget(self, action: "btnAction:", forControlEvents: .TouchDown)
            self.addSubview(btn)
        }
        
//        3.创建一个imageView
        let imageView = UIImageView.init()
        imageView.image = UIImage.init(named: "luffy1")
        imageView.tag = 200
        self.addSubview(imageView)
        
    }
    
    func btnAction(btn: UIButton) {
        
//        想要将按钮上的内容显示到ViewController中的textField上但是YTKryBoard是做不到的但是VieweController可以做到
        
//        确定三要素
//        委托:YTKeyBoard
//        协议:将指定按键上的内容显示在textField
//        代理:ViewContoller
        
        
        
//        currentTitle属性->按钮上的文字
        print(btn.currentTitle)
        
//        让代理去显示按钮上的内容
        self.delegate?.showContent(btn)
        
    }
    
}

class ViewController: UIViewController,YTKeyBoardDelegate {

    var textField = UITextField()
    override func viewDidLoad() {
        super.viewDidLoad()
     
       
//        1.创建一个UITextField对象
         textField = UITextField.init(frame: CGRectMake(100, 100, 200, 50))
        textField.backgroundColor = UIColor.yellowColor()
        self.view.addSubview(textField)
        
        
//        使用自己的键盘
        let keyBoard = YTKeyBoard(frame: CGRectMake( 0,0,100,256))
        keyBoard.backgroundColor = UIColor.redColor()
        textField.inputView = keyBoard
        
        keyBoard.delegate = self
        
        
    }

// MARK: - YTKeyBoard delegate
    func showContent(button: UIButton) {
        
        if button.currentTitle == "返回" {
//            收起键盘
            self.textField.resignFirstResponder()
            return
        }
        
//        判断textField中的文字是否为空,不为空才做删除操作
        if button.currentTitle == "C" {
//
            if self.textField.text?.characters.count > 0 {
//           拿到最后一个字符的Index
                let last = self.textField.text?.endIndex.predecessor()
//                移除最后一个字符
                var text = self.textField.text!
                text.removeAtIndex(last!)
                self.textField.text = text
            }
            return
        }
        textField.text! += button.currentTitle!
    }

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容