视图中的委托协议、数据源协议与高级视图
一些高级视图的功能比较复杂,我们需要将这些复杂功能从视图本身剥离开来,由另外一些类完成。当然,这些类需要遵守视图指定的协议。
- 相对简单的视图——只指定了委托协议,包括UITextField和UITextView,对应的委托协议命名规则是**“视图名+Delegate”**
- 对于一些比较复杂的视图,我们同时制定委托协议数据源协议,这些视图在iOS中不是很多,其中主要有选择器(UIPickerView)、集合视图(UICollectionView)和表视图(UItableView)对应的数据源协议命名规则是视图名+DataSourse)
在软件领域,有句话很经典:“有输入的地方,就要验证”
1.选择器
import UIKit
class ViewController: UIViewController{
var datePicker:UIDatePicker!
var label:UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let screen = UIScreen.main.bounds
self.view.backgroundColor = .clear
//添加日期选择器
let datePickerWidth:CGFloat = 320
let datePickerHeight:CGFloat = 167
self.datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: datePickerWidth, height: datePickerHeight))
//设置简体中文
self.datePicker.locale = NSLocale(localeIdentifier: "zh-Hans") as Locale
//设置日期时间格式
self.datePicker.datePickerMode = .dateAndTime
self.view.addSubview(datePicker)
//添加标签
let labelHeight:CGFloat = 200
let labelWidth:CGFloat = 21
let labelTopView:CGFloat = 281
self.label = UILabel(frame: CGRect(x: (screen.size.width - labelWidth)/2, y: labelTopView, width: labelWidth, height: labelHeight))
self.label.text = "请选择日期:"
self.label.textAlignment = .center
self.label.textColor = .white
self.view.addSubview(self.label)
//添加button按钮
let button = UIButton(type: .system)
let buttonHeight:CGFloat = 46
let buttonWidth:CGFloat = 30
let buttonTopView:CGFloat = 379
button.frame = CGRect(x: (screen.size.width - buttonWidth)/2, y: buttonTopView, width: buttonWidth, height: buttonHeight)
button.setTitle("选择", for: UIControl.State())
button.addTarget(self, action: #selector(onClick(_:)), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func onClick(_ sender:AnyObject){
let theDate:NSDate = self.datePicker.date as NSDate
//该属性返回选择的时间
let desc = theDate.description(with: NSLocale.current)
//该属性返回本地化的日期信息
NSLog("the date picked is:%@", desc)//日志信息
let dateFormatter:DateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd HH:mm:ss"
NSLog("the date formate is :%@", dateFormatter.string(from: theDate as Date))//日志信息
self.label.text = dateFormatter.string(from: theDate as Date)
}
}
2.集合视图
UICollecltionViewFlowLayout是一种流式布局管理器,从左到右从上到下布局