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. python3 中 and 和 or 运算规律

    一.包含一个逻辑运算符 首先从基本的概念着手,python中哪些对象会被当成 False 呢?而哪些又是 True 呢? 在Python中,None.任何数值类型中的0.空字符串“”.空元组().空列 ...

  2. NSPredicate 谓词总结 数组过滤 模糊匹配

    NSPredicate 用于指定过滤条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配. NSPredicate常用方法介绍 1.创建NSPredicate(相当于创建一个过滤条件 ...

  3. 学习使用常用的windbg命令(u、dt、ln、x)

    http://blog.csdn.net/wesley2005/article/details/51501514 目录: (1) u命令(反汇编) (2) dt命令(查看数据结构) (3) ln命令( ...

  4. Android Studio Emulator 提示 “/dev/kvm is not found” 解决办法

    重新安装HAXM即可解决 1.确定已经安装HAXM SDK Manager -> Extras -> Intel x86 Emulator Accelerator (HAXM instal ...

  5. 8、面向对象class

    对象的概念同其他语言的对象相同 一个基本的类 #!/usr/bin/python class person: def hi(self,name): print 'Hello,%s'%name p1= ...

  6. iOS:创建静态库及其使用

    本篇来自转载,原创链接为:http://my.oschina.net/leejan97/blog/284193 摘要: 静态库文件可以有效的将功能封装和细节隐藏  ios 静态库 static lib ...

  7. onvif 协议

    1.ONVIF 协议解读 https://www.onvif.org 一.什么是ONVIF? 1.1形成 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共 ...

  8. css样式布局中position的那些事儿

    哎,页面布局及设计开发.对于一个一直从事后台开发来说屌丝来说,确实是件非常费时.费力,非常艰难的一件事. 今晚是想实现把多张重叠在一起.或是标记一张图片中不同的位置然后赋以超链接.花了一晚上的时间,才 ...

  9. 【Excle】二维表转化为一维表

    现在我们想做如下操作: 想把表1的数据转化为表2的数据,那么我们只需要如下这段代码即可解决需求 Sub 转置() Dim i%, arr arr = Application.InputBox(&quo ...

  10. H5网站模板——前台和后台

    以下是比较典型的前台或者后台的H5模板: html5优分期大学生分期购物商城模板链接:http://pan.baidu.com/s/1dEUAzBz 密码:j150 红色的五金电气商城网站模板链接:h ...