swift中的代理实现和oc中是有区别的

protocol HXQLimitedTextFieldDelegate{
func test()
}

代理中默认所有方法都是required,如果需要某个代理方法是可选的,则需要用下面的方法

@objc protocol HXQLimitedTextFieldDelegate: class{
func test()
@objc optional func test2()
}

如果需要代理有responds(to: <#T##Selector!#>)方法,则需要遵守协议

@objc protocol HXQLimitedTextFieldDelegate: NSObjectProtocol{
func test()
@objc optional func test2()
}

设置代理

weak var realDelegate: HXQLimitedTextFieldDelegate?  //这里需要用weak防止循环引用

附一段代码:(HXQLimitedTextField swfit版本)具体使用方法请参考:https://www.cnblogs.com/qqcc1388/p/7251117.html

HXQLimitedTextField能够快速实现以下功能(支持xib):

  1. 限制输入的字符(数字,字母,数字+字母,email等)
  2. 提供一个可以监听textField实时改变的方法,不需要自己去写观察者
  3. 限制输入文字的最大长度
  4. 限制textField距离leftPading rightPading
  5. 更方便快捷的设置leftView rightView
  6. 设置placeholderColor
//
// HXQLimitedTextField.swift
// hxquan-swift
//
// Created by Tiny on 2018/11/5.
// Copyright © 2018年 hxq. All rights reserved.
// import UIKit enum HXQLimitedTextFieldType: Int {
case normal = 0 //默认
case number //数字
case numberOrLetter //数字和字母
case email //数字 字母 和 特定字符( '.' '@')
case password //数字 字母 下划线
} let kLetterNum = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
let kEmail = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
let kPassword = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" @objc protocol HXQLimitedTextFieldDelegate: class{ //为了防止 self.delegate = self 然后外部有重写了这个delegate方法导致代理失效的问题,这里重写一遍系统的代理方法
//在使用HXQLimitedTextField的使用请不要使用UITextField本身代理方法
//这里只是拓展了textField的部分代理,如果有需要还可以自己实现在这里添加 /// 键盘return键掉用
///
/// - Parameter textField: textField
/// - Returns:
@objc optional func limitedTextFieldShouldReturn(_ textField: HXQLimitedTextField) -> Bool /// 输入结束调用
///
/// - Parameter textField: textField
@objc optional func limitedTextFieldDidEndEditing(_ textField: HXQLimitedTextField) /// 输入开始调用
///
/// - Parameter textField: textField
@objc optional func limitedTextFieldDidBeginEditing(_ textField: HXQLimitedTextField) /// 输入内容改变调用(实时变化)
///
/// - Parameter textField: textField
@objc optional func limitedTextFieldDidChange(_ textField: HXQLimitedTextField) /// 输入开始启动的时候调用
///
/// - Parameter textField: textField
/// - Returns:
@objc optional func limitedTextFieldShouldBeginEditing(_ textField: HXQLimitedTextField) -> Bool } class HXQLimitedTextField: UITextField { /// 代理方法 尽量使用这个代理而不是用textfield的代理
weak var realDelegate: HXQLimitedTextFieldDelegate? /// HXQLimitedTextFieldType 根据type值不同 给出不同limited 默认HXQLimitedTextFieldTypeNomal
var limitedType: HXQLimitedTextFieldType = .normal {
didSet{
if limitedType == .normal {
keyboardType = .default
filter = nil
}else {
keyboardType = .asciiCapable
if limitedType == .number {
keyboardType = .numberPad
filter = nil
}else if limitedType == .numberOrLetter {
filter = kLetterNum
}else if limitedType == .email {
filter = kEmail
}else if limitedType == .password {
filter = kPassword
}
}
}
} /// HXQTextField内容发生改变block回调
var textFiledDidChange: ((String)->Void)? /// textField允许输入的最大长度 默认 0不限制
var maxLength: Int = 0 /// 给placeHolder设置颜色
var placeholderColor: UIColor? {
didSet{
attributedPlaceholder = NSAttributedString(string:placeholder ?? "" ,attributes: [NSAttributedString.Key.foregroundColor : placeholderColor as Any])
// setValue(placeholderColor, forKeyPath: "placeholderLabel.textColor") }
} /// 距离左边的间距 默认10
var leftPadding: CGFloat = 10 {
didSet{
setValue(leftPadding, forKey: "paddingLeft")
}
} /// 距离右边的间距 默认10
var rightPadding: CGFloat = 10 {
didSet{
setValue(rightPadding, forKey: "paddingRight")
}
} /// textField -> leftView
var customLeftView: UIView? {
didSet{
leftView = customLeftView
leftViewMode = .always
}
} /// textField -> RightView
var customRightView: UIView? {
didSet{
rightView = customRightView
rightViewMode = .always
}
} fileprivate var filter: String? override init(frame:CGRect) {
super.init(frame:frame)
setup()
} required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
} func setup(){
font = UIFont.systemFont(ofSize: 14)
delegate = self
textAlignment = .left
addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
}
} extension HXQLimitedTextField: UITextFieldDelegate{ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return realDelegate?.limitedTextFieldShouldReturn?(self) ?? true
} func textFieldDidBeginEditing(_ textField: UITextField) {
realDelegate?.limitedTextFieldDidBeginEditing?(self)
} func textFieldDidEndEditing(_ textField: UITextField) {
realDelegate?.limitedTextFieldDidEndEditing?(self)
} func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return (realDelegate?.limitedTextFieldShouldBeginEditing?(self)) ?? true
} func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//超过最大长度 并且不是取消键被点击了
if textField.text!.count > maxLength && maxLength > 0 && string != "" {
return false
} //没有筛选条件直接跳过
if filter == nil {
return true
} //限制条件
let cs = CharacterSet(charactersIn: filter!) //按cs分离出数组,数组按@""分离出字符串
let filtered = string.components(separatedBy: cs ).joined(separator: "") return filtered == string
} @objc func textFieldDidChange(_ textField: UITextField){
realDelegate?.limitedTextFieldDidChange?(self)
textFiledDidChange?(textField.text ?? "")
} override func placeholderRect(forBounds bounds: CGRect) -> CGRect { if #available(iOS 11.0, *) {
//如果是左对齐 则+leftPadding
//右对齐 则-rightPadding
//中间对其 则pading设置为0
var padding: CGFloat = 0;
if textAlignment == .right{
padding = -rightPadding;
}else if self.textAlignment == .left {
padding = leftPadding;
}
let rect = CGRect(x: bounds.origin.x+padding, y: bounds.origin.y, width: bounds.size.width, height: bounds.size.height)
return super.placeholderRect(forBounds: rect)
}
return super.placeholderRect(forBounds: bounds)
} }

iOS swift 代理协议的更多相关文章

  1. iOS swift的xcworkspace多项目管理(架构思想)

    iOS  swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...

  2. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  3. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  4. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  5. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

  6. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK

    iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言:    今天给大家 ...

  7. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  8. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

  9. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

随机推荐

  1. SVN 文件删除及恢复

    SVN 文件删除及恢复 在TortoiseSVN管理的项目中删除文件的方法:   1. 在客户端按delete删除(OS中删除,不通过SVN)           ● 未提交之前一旦Update则被删 ...

  2. nginx 隐藏index.php 并开启rewrite日志调试(apache也有)

    开启rewrite 日志 error_log       /data/log/nginx/error.log notice; 位于最外层,大约在文件的前几行 再在http{}括号里增加一行:rewri ...

  3. 还原数据库完整sq语句l

    use master go declare @dbname varchar ( 20) set @dbname = 'QADB' declare @sql nvarchar ( 500) declar ...

  4. nagios系列教程地址

    http://www.sosidc.com/sort/10/page/3 http://www.sosidc.com/sort/10/page/2 http://www.sosidc.com/sort ...

  5. ibatis中使用List作为传入参数的使用方法及 CDATA使用

    ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用: (List)getSqlMapClientTemplate().queryForList(" ...

  6. 常见配置Server错误导致import 包无效等问题解决

  7. LINUX 和WINDOWS下的自动登录小脚本

    每天上班第一件事,就是连接公司LAB里面的机器,但首先要过一个防火墙,每次输用户名密码是很累人的事, 以下是两个脚本,可以放在启动项中,开机便自动登录 WINDOWS: @echo off ipcon ...

  8. Python 自用代码(拆分txt文件)

    现有一个28G的txt文件,里面每一行是一个分词过的专利全文文档,一共370多万行.我需要把它按每五万行为单位做成一个json文件,格式大致如下: [{"id":"100 ...

  9. vue2组件之异步组件...resolve

    看开源项目的时候看到这样的用法: 发现与之前定义组件的方式不一样,这个resolve又是什么? 原来这个是vue的异步组件实现,可以看这里:<异步组件> 异步组件的需求: 在大型应用中,我 ...

  10. maven命令解释

    打包:mvn package编译:mvn compile编译测试程序:mvn test-compile清空:mvn clean运行测试:mvn test生成站点目录: mvn site生成站点目录并发 ...