阅读 245

Swift之UITextField+富文本+代理传值

###导语: UITextField有许多好玩好用的地方,因此敝人整理了一些知识点和技巧分享给大家。

####一、初始化

var textField: UITextField!

 override func viewDidLoad() {
        super.viewDidLoad()
 let width = UIScreen.mainScreen().bounds.width
        
        //创建UITextField,并设置背景颜色
        let textField: UITextField = UITextField(frame: CGRectMake(50,100,width - 100,30))
//        textField.backgroundColor = UIColor.yellowColor()
        self.view.addSubview(textField)
        self.textField = textField
}
复制代码

####二、基本属性

//1.设置背景视图,设置占位符,使用KVC设置占位符的颜色,文本字体及其颜色
//        textField.background = UIImage(named: "1.jpg")
        textField.placeholder = "任大树有感"
        textField.setValue(UIColor.blueColor(), forKeyPath: "placeholderLabel.textColor")
        textField.font = UIFont.systemFontOfSize(17)//系统默认字体
        textField.font = UIFont(name: "CourierNewPSMT", size: 17)//自定义字体和大小
        textField.textColor = UIColor.blackColor()
        textField.tintColor = UIColor.redColor()//光标及清除按钮颜色
        
        
        //2.设置对齐方式及垂直对齐方式,文本框样式,最小字体,自动适应标签大小
        textField.textAlignment = .Center
        textField.contentVerticalAlignment = .Bottom 
        /* 文本框样式
         None  不做修饰
         Line  线条
         Bezel 斜面
         RounderRect  扁平化
         */
        textField.borderStyle = .RoundedRect
        textField.minimumFontSize = 10.0//默认0.0
        textField.adjustsFontSizeToFitWidth = true
复制代码

####三、高级点儿的常用属性

1.设置删除效果,编辑状态,文本框是否可用,首字母是否大写
/* 删除效果
         Never 不显示清除按钮
         WhileEditing 编辑时才出现清除按钮
         UnlessEditing 完成编辑后才出现清除按钮
         Always 一直都显示清除按钮
         */
        textField.clearButtonMode = .Always
        textField.editing
        //        textField.enabled = false
        /* 首字母是否大写
         enum UITextAutocapitalizationType : Int {
         
         case None   不自动大写
         case Words  单词首字母大写
         case Sentences  句子的首字母大写
         case AllCharacters  所有字母都大写
         }
         */
        self.textField.autocapitalizationType = .AllCharacters
        self.textField.becomeFirstResponder()//成为第一响应

//2.创建左视图及其显示类型,创建右视图及其显示类型
  let leftView: UIImageView = UIImageView(frame: CGRectMake(0,0,30,30))
        leftView.image = UIImage(named: "1.jpg")
        /* 同上
         Never 不显示
         WhileEditing 编辑时才出现
         UnlessEditing 完成编辑后才出现
         Always 一直都显示
         */
        textField.leftView = leftView
        textField.leftViewMode = .Always
        //右视图,可能盖住了清除按钮
        let rightView: UIImageView = UIImageView(frame: CGRectMake(0,0,30,30))
        rightView.backgroundColor = UIColor.purpleColor()
        textField.rightView = rightView
        textField.rightViewMode = .UnlessEditing

/*
         3.键盘外观
         enum UIKeyboardAppearance : Int {
         
         case Default 默认外观
         case Dark  深灰石墨色
         case Light  浅灰色
         
         }
         */
        textField.keyboardAppearance = .Dark
        
        /*


         4.完成的按钮样式
         enum UIReturnKeyType : Int {
         
         case Default   默认灰色按钮,标有Return
         case Go   标有go的蓝色按钮
         case Google  标有Search的蓝色按钮
         case Join   标有Join的蓝色按钮
         case Next  标有Next的灰色按钮
         case Route  标有Route的蓝色按钮
         case Search  标有Search的蓝色按钮
         case Send    标有Send的蓝色按钮
         case Yahoo  标有Search的蓝色按钮
         case Done   标有Done的蓝色按钮
         case EmergencyCall   标有EmergencyCall(紧急呼叫)的蓝色按钮
         @available(iOS 9.0, *)
         case Continue     标有Continue的灰色按钮
         }
         */
        textField.returnKeyType = .Continue
复制代码

###四、UITextField代理方法

 //1.文本框将要开始编辑时,触发的事件
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool{ // return NO to disallow editing.(如果返回 false 文本框将不允许编辑)
        
        return true
    }
    //2.文本框开始编辑,所作的事儿
    func textFieldDidBeginEditing(textField: UITextField){ // became first responder
    
    }
    //3.文本框将要结束编辑时,触发该事件
    func textFieldShouldEndEditing(textField: UITextField) -> Bool{ // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end

        return true
    }
    //4.文本框结束编辑,触发的事件。
    func textFieldDidEndEditing(textField: UITextField){ // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
        
        
    }
    //5.文本框内容改变触发该事件,能得到改变的坐标和改变的内容
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{ // return NO to not change text(返回 false 不可改变文本)
        
        
        return true
    }
    //6.文本框清空时触发该事件
    func textFieldShouldClear(textField: UITextField) -> Bool{ // called when clear button pressed. return NO to ignore (no notifications) (返回true,当清除按钮点击时回调此方法,返回false则忽视)
    
        print("文本框内容被清除拉!!")
        
       
        return true
    }
    //7.点击键盘中的return键,触发该事件
    func textFieldShouldReturn(textField: UITextField) -> Bool{ // called when 'return' key pressed. return NO to ignore.
        
        print("点击了键盘中的return")//微信把此事件改为 发送消息事件
        return true
    }

复制代码

###五、监听方法

//监听的方法
    func notificationAction() {
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(textDidChange), name: UITextFieldTextDidChangeNotification, object: nil)
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(textDidEndEditing), name: UITextFieldTextDidEndEditingNotification, object: nil)
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(textDidBeginEditing), name: UITextFieldTextDidBeginEditingNotification, object: nil)
    }
    func textDidChange() {
       print("每次编辑触发该事件")
    }
    func textDidEndEditing() {
       print("结束编辑触发该事件")
    }
    func textDidBeginEditing() {
       print("开始编辑")
    }


 //MARK: - 移除监听
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(true)
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
复制代码

###六、富文本设置

 //1.创建富文本
  let attributeStr: NSMutableAttributedString = NSMutableAttributedString(string: "任大树有感")
 //2.设置字体     
attributeStr.addAttribute(NSFontAttributeName, value: UIFont(name: "CourierNewPSMT", size: 17)!, range: NSRange(location: 0,length: 3))
 //3.设置字体颜色    
attributeStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.lightGrayColor(), range: NSRange(location: 0,length: 5))
 //4.设置背景颜色     
attributeStr.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(), range: NSRange(location: 3, length: 2))

      self.textField.attributedPlaceholder = attributeStr
      
复制代码

###七、代理传值

第一步:在发送页面设置:
/**
 1、制定代理,实现传值 名称命名规范:本类名+Delegate
 */
protocol OtherViewControllerDelegate: NSObjectProtocol {
    /**
     2、定义协议方法,用来传值
     */
    func changeValueWithUITextField(text: String)
}
 /**
     3、定义一个weak属性的代理
     */
    weak var delegate: OtherViewControllerDelegate!
            
       /**
         4、发送代理
         */
@IBAction func clicked(sender: AnyObject) {
self.delegate!.changeValueWithUITextField(self.textField.text!)
        
        self.navigationController?.popViewControllerAnimated(true)
    }


第二步:在接受页面设置:
0.设置按钮跳转页面
   //代理传值方法
    @IBAction func clicked(sender: AnyObject) {
        //代理传值
        let otherVC: OtherViewController = OtherViewController()
        otherVC.delegate = self
        self.navigationController?.pushViewController(otherVC, animated: true)
    }

/**
 1、遵守代理传值协议
 */
class ViewController: UIViewController,UITextFieldDelegate,OtherViewControllerDelegate {}
/**
2.实现协议方法
*/
    func changeValueWithUITextField(text: String) {
        self.textField.text = text
    }
复制代码

附上Demo->UITextField_Demo

###结束语: 有位名人说:“人的聪明之处在于明白自己的无知。”