1. 懒加载
lazy var imageView:UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage.init(named: "big_image")
return imageView
}()
2. 按钮的点击事件
lazy var button:UIButton = {
let button = UIButton()
button.setTitleColor(UIColor.red, for: .normal)
button.backgroundColor = UIColor.white
button.layer.cornerRadius = 2.0
button.layer.masksToBounds = true
button.isHidden = true
button.addTarget(self, action: #selector(buttonClick(_ :)), for: .touchUpInside)
return button
}()
@objc func buttonClick(_ button:UIButton) -> () {
}
3. 协议可选与必选,delegate是否实现协议
- 必选协议
protocol ImageViewDelegate: class {
func selectedImage() -> ()
func removeImage(_ index: Int) -> ()
}
- 可选协议
@objc protocol ImageCellDelegate: NSObjectProtocol {
@objc optional func imageCelllLikeButtonClick(imageCell: ImageCell, commentId: String, userLiked:Bool) -> ()
@objc optional func imageCellDetalButtonClick(imageCell: ImageCell, content:String) -> ()
}
- 代理
weak var delegate:ImageCellDelegate?
注意:
代理继承的父类 class和NSObjectProtocol 的区别
代理继承的父类NSObjectProtocol的时候,判断代理是否实现某个方法responds(to: #selector()能提示处理,继承自class则没法判断
ImageCellDelegate.实现的方法去判断!!!
- 代理是否实现了某个协议
@objc func buttonClick(_ button:UIButton) -> () {
guard let delegate = delegate else { return }
if delegate.responds(to: #selector(ImageCellDelegate.imageCellButtonClick(imageCell:content:))) {
delegate.imageCellButtonClick!(imageCell: self, content: commentLabel.text)
}
}
4. 判断是某个类或某个类及其子类
//判断某个类
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.isMember(of: tableView.classForCoder) {
view.endEditing(true)
}
}
//判断某个类及其子类
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.isKind(of: tableView.classForCoder) {
view.endEditing(true)
}
}
5. tableView的刷新
//刷新所有
self.tableView.reloadData()
//刷新分组
self.tableView.reloadSections([1], with: .none)
//刷新某一个cell或者几个cell
self.tableView.reloadRows(at: [indexPath], with: .none)
6. 正则匹配特定的图片链接
class func getTopicContentImageUrlLink(_ range: NSRange, _ pattern: String = "<img src=\"(.*?)\">", _ content: String) -> [URL] {
var imageUrlArr: [URL] = []
//利用正则匹配
let pattern = pattern
guard let regularExpression = try? NSRegularExpression.init(pattern: pattern, options: .dotMatchesLineSeparators) else { return []}
let regularResults = regularExpression.matches(in: content, options: [], range: NSMakeRange(0, content.count))
for textCheckingResult in regularResults {
//查找到的范围数量
// 0: 和匹配方案完全一致的字符串
// 1: ()中需要匹配的字符串
for idx in 0..<textCheckingResult.numberOfRanges {
let range = textCheckingResult.rangeAt(idx)
let subStr = (content as NSString).substring(with: range)
let url = URL(string: subStr)
if idx == 1 && url != nil {
imageUrlArr.append(url!)
}
}
}
return imageUrlArr
}
7. swift中NSString的UTF-8转码
let content = (newString as NSString).addingPercentEscapes(using: String.Encoding.utf8.rawValue)!
8. GCD通信与延迟操作
//线程通信
DispatchQueue.global().async {
//do async something
DispatchQueue.main.async {
//main thread do UI update
}
}
//延迟操作 DispatchTime 的精度是纳秒
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 10) {
}
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 10) {
}
//DispatchWallTime 的精度是微秒
DispatchQueue.global().asyncAfter(wallDeadline: DispatchWallTime.now() + 2.0) {
}