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. react-native热更新从零到成功中的各种坑

    https://github.com/reactnativecn/react-native-pushy/blob/master/docs/guide.md Android NDK暂时没有安装 在你的项 ...

  2. pandas操作,感觉不错,复制过来的

    整理pandas操作 本文原创,转载请标识出处: http://www.cnblogs.com/xiaoxuebiye/p/7223774.html 导入数据: pd.read_csv(filenam ...

  3. 6.2(java学习笔记)字节流

    一.FileInputStream 文件输入流从文件中获取输入字节.简单的说就是读取文件. 1.构造方法 FileInputStream(File file)//根据指定文件对象创建一个输入流 2.常 ...

  4. 3.4常用类(java学习笔记)Math和Random

    一.Math 这个类包含执行指数.对数.平方根法.三角函数等基本的数字运算. Math中还包含一些静态常量供我们调用. 如PI圆周率,E. 1.abs(),返回该数的绝对值. public class ...

  5. Exercise02_03

    import java.util.Scanner; public class Mi { public static void main(String[] args){ Scanner input = ...

  6. 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  7. oracle 11g jdbc jar包在哪个文件目录

    一. 如果装了oracle数据库的话, 大致是这样的目录:    D:\oracle\product\11.2.0\client_1\oui\jlib\classes12.jar 或者    D:\o ...

  8. nodeJs+socket.io

    1.先安装npm和node 2.安装socket.io npm install socket.io 3.html <!DOCTYPE html> <html lang="e ...

  9. Go测试,功能测试,性能测试,测试辅助,go test 工具,高级测试,IO相关测试,黑盒测试,HTTP测试,进程测试

    go命令教程: http://wiki.jikexueyuan.com/project/go-command-tutorial/0.5.html Go测试 第一个测试 “Hello Test!” 首先 ...

  10. ylbtech-memorandum(备忘录)-数据库设计

    ylbtech-DatabaseDesgin:ylbtech-memorandum(备忘录)-数据库设计 -- ============================================ ...