Swift的日常一些笔记

一:弹出框的自定义View,一个空白的view层,通过调用弹出此类

1.类文件DateSelectView

import UIKit

class DateSelectView:UIView{
    
    var commonView:UIView?
    
   // var commonViewCloseBlock: (() -> Void)?
    
    let ALERTVIEW_HEIGHT = UIScreen.main.bounds.size.height / 2.4
    let ALERTVIEW_WIDTH = UIScreen.main.bounds.size.width - 50
    
    init() {
        let frame = CGRect(x: 0, y: 0,
                           width: screenWidth,
                           height: screenHeight)
        super.init(frame: frame)
        
        initView()
    }
    
    func initView(){
        frame = UIScreen.main.bounds
        commonView = UIView(frame: CGRect(x: 25, y: screenHeight / 2 - ALERTVIEW_HEIGHT / 2, width: ALERTVIEW_WIDTH, height: ALERTVIEW_HEIGHT))
        commonView!.backgroundColor = UIColor.white
        commonView!.layer.cornerRadius = 8.0
        commonView!.layer.masksToBounds = true
        commonView!.isUserInteractionEnabled = true
        addSubview(commonView!)
        
        showView()
        
    }
    
    func showView(){
        
        backgroundColor = UIColor.clear
        UIApplication.shared.keyWindow?.addSubview(self)
    
        let transform: CGAffineTransform = CGAffineTransform(scaleX: 1.0,y: 1.0)
        commonView!.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
        commonView!.alpha = 0
        UIView.animate(withDuration: 0.3, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 10, options: .curveLinear, animations: {
            self.backgroundColor = UIColor.black.withAlphaComponent(0.4)
            self.commonView!.transform = transform
            self.commonView!.alpha = 1
        }) { finished in
        }
        
    }
    
    func hideView() {
        UIView.animate(withDuration: 0.5, animations: {
            self.transform = self.transform.translatedBy(x: 0, y: -self.frame.maxY)
            self.commonView!.alpha = 0
        }) { isFinished in
            self.commonView!.removeFromSuperview()
            self.removeFromSuperview()
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init code erro!!")
    }  
}

2.Controller文件

private var dateSelectView : DateSelectView?

dateSelectView = DateSelectView()

3.此时就可以通过按钮事件,或其他的事件,触发自定义view

4.添加按钮的事件,(确认,取消)

在view(DateSelectView)类文件添加

    var sureBtn:UIButton?
    
    var cancelBtn:UIButton?
        //按钮视图栏目
        sureBtn = UIButton()
        sureBtn?.backgroundColor = UIColor(hexString: "#999999", transparency: 1.0)
        sureBtn?.layer.cornerRadius = 15
        sureBtn?.setTitle("确定", for: .normal)
        commonView!.addSubview(sureBtn!)
        
        sureBtn!.snp.makeConstraints{(make)->Void in
            make.left.equalTo(commonView!).offset(10)
            make.width.equalTo(commonView!).multipliedBy(0.4)
            make.bottom.equalTo(commonView!).offset(-10)
            make.height.equalTo(55)
        }
        
        cancelBtn = UIButton()
        cancelBtn?.backgroundColor = UIColor(hexString: "#999999", transparency: 1.0)
        cancelBtn?.layer.cornerRadius = 15
        cancelBtn?.setTitle("取消", for: .normal)
        commonView!.addSubview(cancelBtn!)
        
        cancelBtn!.snp.makeConstraints{(make)->Void in
            make.right.equalTo(commonView!).offset(-10)
            make.width.equalTo(commonView!).multipliedBy(0.4)
            make.bottom.equalTo(commonView!).offset(-10)
            make.height.equalTo(55)
        }

        sureBtn!.addTarget(self, action: #selector(sureOnClick(sender:)), for: .touchUpInside)
        
        cancelBtn!.addTarget(self, action: #selector(cancelOnClick(sender:)), for: .touchUpInside)
    //view层的确认按钮
    @objc func sureOnClick(sender:UIButton){
        if sureBolck != nil{
            sureBolck!(true)
        }
        hideView()
    }
    
    //view层的取消按钮
    @objc func cancelOnClick(sender:UIButton){
        hideView()
    }

此时view弹出层的两个按钮可以实行点击了,并且视图层view会进行隐藏消失

再继续添加按钮事件到controller文件,从而可以在控制器界面进行调用

  • view弹出层
typealias sureBtnClick = (_ select:Bool) -> Void

class DateSelectView:UIView{
 var sureBolck:sureBtnClick?
    //controller层的按钮方法调用
    func clickSureBtn(_ block: @escaping sureBtnClick) {
        sureBolck = block
    }
}
  • controller层
 dateSelectView?.clickSureBtn({_ in
            
      print("dd")
                
   })
   //此时点击确定按钮,能输出数据到controller文件

二:UITextField的一些属性

let textField = UITextField()
textField.keyboardType = .numberPad//键盘只能输入数字

三:日期的一些常用代码

1.打印出日期:如2023-5-20

let date = Date() // 获取当前日期
let dateFormatter = DateFormatter() // 初始化日期格式化器
dateFormatter.dateFormat = "yyyy-MM-dd" // 设置日期格式
let dateString = dateFormatter.string(from: date) // 将日期转化为字符串
print(dateString) // 打印日期字符串

其中,Date表示当前的日期时间,DateFormatter用于将日期格式化为指定的字符串格式。在上面的代码中,我们首先通过Date()获取当前的日期时间,然后创建一个DateFormatter并设置其日期格式为"yyyy-MM-dd",最后通过string(from:)方法将日期转化为指定格式的字符串。
需要注意的是,上面的代码中打印的日期字符串只包含年月日,不包含具体的时间信息。如果需要包含时间信息,可以将日期格式设置为"yyyy-MM-dd HH:mm:ss"等格式。

四:UIScrollView

1.UIScrollView如何设置圆角

 lfAddView?.showsHorizontalScrollIndicator = false // 隐藏横向滚动条
lfAddView?.showsVerticalScrollIndicator = false // 隐藏纵向滚动条
lfAddView?.backgroundColor = UIColor.clear // 设置为透明色
lfAddView?.layer.cornerRadius = 10 // 设置圆角半径
lfAddView?.layer.masksToBounds = true // 裁剪超出圆角范围的部分

五:弹窗封装

1.确认+取消

在一个公共类中添加这个方法

    //弹窗(确认-取消)
     func showAlert(from viewController: UIViewController, title: String, message: String, okHandler: @escaping () -> Void) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
        let okAction = UIAlertAction(title: "确定", style: .destructive, handler: { action in
            okHandler()
        })
        alert.addAction(cancelAction)
        alert.addAction(okAction)
        viewController.present(alert, animated: true, completion: nil)
    }

2.在controller控制层界面调用方法

AlertHelper.showAlert(from: self, title: "确认删除", message: "确定要删除这条记录吗?") {
        // 执行删除操作
        let id = lfClientArrayList[indexPath.row].id!
        let idString = "\(id)"
        lfClientPresenter.deleteDataListJson(id:idString , userId: userId!, token: auth!)
        lfClientArrayList.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

六:界面点击输入框外的区域实现隐藏键盘(封装)

1.公共类中添加此方法

class KeyboardHelper {
    static func addTapGestureToHideKeyboard(to view: UIView) {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        view.addGestureRecognizer(tapGesture)
    }
    
    @objc static func handleTap(_ gesture: UITapGestureRecognizer) {
        gesture.view?.endEditing(true)
    }
}

2.在任意controller控制层进行调用

override func viewDidLoad() {
    super.viewDidLoad()
    KeyboardHelper.addTapGestureToHideKeyboard(to: view)
}

七:列表向左滑动删除的功能

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        allExpanded.showAlert(from: self, title: "确认删除", message: "确定要删除这条记录吗?") { [self] in
            // 执行删除操作
            let id = lfClientArrayList[indexPath.row].id!
            let idString = "\(id)"
            lfClientPresenter.deleteDataListJson(id:idString , userId: userId!, token: auth!)
            lfClientArrayList.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "删除"
}

八:动态定义多数据添加界面布局

1.view

import UIKit

protocol LFClientAddViewDelegate:NSObjectProtocol{
    
    func onlfAddDateLick(_ sender: UIButton, text: String, tag: Int)

}

class LFClientAddView:BaseView{
    
    weak var delegate:LFClientAddViewDelegate?
    
    let data = ["客户名称", "客户类型","联系人","联系电话","访问结果","访问次数","日期","经办人","经办日期","备注"]
    
    var addview:UIView?
    
    var lfAddView:UIScrollView?
    
    var kName:UITextField?
    
    var khType:UITextField?
    
    var lxname:UITextField?
    
    var lxpw:UITextField?
    
    var lfjg:UITextField?
    
    var lfno:UITextField?
    
    var lfdate:UIButton?
    
    var aname:UITextField?
    
    var adate:UIButton?
    
    var remark:UITextField?
    
    
    override func initView() {
        super.initView()
        
        addview = UIView()
        addview?.backgroundColor = UIColor(hexString: "#F5F5F5", transparency: 1.0)
        self.addSubview(addview!)
        
        addview!.snp.makeConstraints { make in
            make.top.equalTo(self).offset(0)
            make.bottom.equalTo(self).offset(0)
            make.left.equalTo(self).offset(0)
            make.right.equalTo(self).offset(0)
            
        }
        
        lfAddView = UIScrollView()
        lfAddView?.backgroundColor = UIColor.white
        lfAddView?.showsHorizontalScrollIndicator = false // 隐藏横向滚动条
        lfAddView?.showsVerticalScrollIndicator = false // 隐藏纵向滚动条
        lfAddView?.layer.cornerRadius = 10 // 设置圆角半径
        lfAddView?.layer.masksToBounds = true // 裁剪超出圆角范围的部分
        addview!.addSubview(lfAddView!)
        
        lfAddView?.snp.makeConstraints({ make in
            make.top.equalTo(self).offset(70)
            make.bottom.equalTo(self).offset(-10)
            make.left.equalTo(self).offset(10)
            make.right.equalTo(self).offset(-10)
        })
        
        var offset = 10 // 初始偏移量
        
        //开始循环数据列表
        for (index, item) in data.enumerated() {
            
            //标题label
            let kNameLb = UILabel()
            kNameLb.text = item
            kNameLb.textColor = UIColor(hexString: LF_CLIENT_KHZL_ITEM_TITLE, transparency: 1.0)
            kNameLb.font = UIFont(name: "", size: 22)
            lfAddView?.addSubview(kNameLb)
            
            kNameLb.snp.makeConstraints { make in
                make.top.equalTo(lfAddView!).offset(offset)
                make.width.equalTo(screenWidth)
                make.height.equalTo(23)
            }
            
            //输入框
            let textField = UITextField()
            textField.placeholder = "请输入\(item)"
            textField.returnKeyType = .done
            textField.tag = index // 设置tag值
            lfAddView?.addSubview(textField)
            
            textField.snp.makeConstraints({ make in
                make.top.equalTo(kNameLb).offset(30)
                make.width.equalTo(screenWidth-20)
                make.height.equalTo(39)
            })
            
            //按钮
            let uiButton = UIButton()
            uiButton.tag = index
            
            uiButton.setTitleColor(UIColor.black, for: .normal)
            uiButton.titleLabel?.font = UIFont.systemFont(ofSize: 15)
            uiButton.addTarget(self, action: #selector(onLfdateClick(sender:)), for: .touchUpInside)
            lfAddView?.addSubview(uiButton)
            
            uiButton.snp.makeConstraints({ make in
                make.top.equalTo(kNameLb).offset(30)
                make.width.equalTo(screenWidth)
                make.height.equalTo(39)
            })
            
            //横线
            let mUserpwd = UIView()
            mUserpwd.backgroundColor = UIColor(hexString: "#e0e0e0", transparency: 1.0)
            lfAddView!.addSubview(mUserpwd)
            
            mUserpwd.snp.makeConstraints { make in
                make.top.equalTo(textField).offset(41)
                make.width.equalTo(screenWidth)
                make.height.equalTo(1)
            }
            
            //通过textField.tag定义的index来判断展示的UI
            if index == 0 {
                uiButton.isHidden = true
                kName = textField
            } else if index == 1 {
                uiButton.isHidden = true
                khType = textField
            } else if index == 2 {
                uiButton.isHidden = true
                lxname = textField
            }else if index == 3{
                uiButton.isHidden = true
                textField.keyboardType = .numberPad
                lxpw = textField
            }else if index == 4{
                uiButton.isHidden = true
                lfjg = textField
            }else if index == 5{
                uiButton.isHidden = true
                textField.keyboardType = .numberPad
                lfno = textField
            }else if index == 6{
                textField.isHidden = true
                lfdate = uiButton
            }else if index == 7{
                uiButton.isHidden = true
                aname = textField
            }else if index == 8{
                textField.isHidden = true
                adate = uiButton
            }else if index == 9{
                uiButton.isHidden = true
                remark = textField
            }
            
            offset += 80 // 增加偏移量
            
        }
        
        // 设置UIScrollView的滚动范围
        lfAddView!.contentSize = CGSize(width: lfAddView!.bounds.width, height: 900)
        
    }
    
    @objc func onLfdateClick(sender: UIButton) {
        
        // 按钮点击事件
        let buttonText = sender.currentTitle ?? ""
        // 获取tag值
        let tag = sender.tag
        // 可以在这里处理代理回调等逻辑
        if let delegate = delegate {
            delegate.onlfAddDateLick(sender, text: buttonText, tag: tag)
        }
        
    }
}

2.LFClientAddController

class LFClientAddController:NavigationController,NavigationRightDelegate,LFClientAddProtocol,LFClientAddViewDelegate,UITextFieldDelegate{

var addview: LFClientAddView!

override func initView() {
        super.initView()
        
        //let view = UIView()
        addview = LFClientAddView(frame: view.bounds)
        
        addview.delegate = self
        delegate = self

        addview.kName?.delegate = self
        addview.khType?.delegate = self
        addview.lxname?.delegate = self
        addview.lxpw?.delegate = self
        addview.lfjg?.delegate = self
        addview.lfno?.delegate = self
        addview.aname?.delegate = self
        addview.remark?.delegate = self

        view.addSubview(addview)
    }
}

九:UITextField和UITextView的键盘回收

1.方法的代码

//UITextField的键盘回收
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
 //textView键盘按下return回收事件
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false // 这里返回false,代表按下return键不会产生换行,同时隐藏键盘
        }
        return true
    }

2.实现代理

class LFClientListItemController:NavigationController,UITextFieldDelegate,UITextViewDelegate{

  override func initView() {
        super.initView()
  
    lfListItemView.delegate = self
	lfListItemView.remark?.delegate = self // 设置代理

}
}