Swift 实现委托协议
我试图实现一个委托协议,但显然我做得都不对。我正在使用cocoapod:,我试图联系开发人员寻求帮助,但到目前为止,他从未回复我 在我添加并安装了pod之后,我将.swift文件添加到我的项目中,并添加了以下方法,该方法可以很好地显示日期选择器:Swift 实现委托协议,swift,delegates,cocoapods,protocols,Swift,Delegates,Cocoapods,Protocols,我试图实现一个委托协议,但显然我做得都不对。我正在使用cocoapod:,我试图联系开发人员寻求帮助,但到目前为止,他从未回复我 在我添加并安装了pod之后,我将.swift文件添加到我的项目中,并添加了以下方法,该方法可以很好地显示日期选择器: class CalculatorViewController: UIViewController, SMDatePickerDelegate { @IBOutlet weak var lblDate: UILabel! override func
class CalculatorViewController: UIViewController, SMDatePickerDelegate {
@IBOutlet weak var lblDate: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Initialize
let tap = UITapGestureRecognizer(target: self, action: #selector(CalculatorViewController.tapFunction))
lblDate.isUserInteractionEnabled = true
lblDate.addGestureRecognizer(tap)
// Set label date
let dt = Date()
lblDate.text = dt.asString(style: .short)
}
@IBAction func datePicker(picker: SMDatePicker, didPickDate date: NSDate) {
let picked = date as Date
lblDate.text = picked.asString(style: .short)
}
@IBAction func tapFunction(sender: UITapGestureRecognizer) {
var picker: SMDatePicker = SMDatePicker()
picker.pickerMode = .date
picker.showPickerInView(view, animated: true)
print("tap working")
}
func datePicker(_ picker: SMDatePicker, didPickDate date: Date) {
let picked = date
print(date)
}
}
我正试图从日期选择器那里得到结果。根据pod,各种方法如下:
// Initialize
var picker: SMDatePicker = SMDatePicker()
// Set delegate
picker.delegate = self
You have SMDatePickerDelegate protocol to handle picker’s events. Here are list:
datePickerWillAppear(picker: SMDatePicker)
datePickerDidAppear(picker: SMDatePicker)
datePicker(picker: SMDatePicker, didPickDate date: NSDate)
datePickerDidCancel(picker: SMDatePicker)
datePickerWillDisappear(picker: SMDatePicker)
datePickerDidDisappear(picker: SMDatePicker)
我的问题是我不知道如何实现这一点,任何帮助都将不胜感激。首先,在
CalculatorViewController
中添加一个引用脚本/XIB中日期选择器的出口
然后,在viewDidLoad()
中,将类指定为其委托
@ibvar-datePicker:SMDatePicker!
重写func viewDidLoad(){
self.datePicker.delegate=self
}
添加为其委托的类必须符合SMDatePickerDelegate
协议,您的示例就是这样做的
然后,只需将这些方法添加到类中以对其事件作出反应。例如:
func日期选择器(选择器:SMDatePicker,didPickDate日期:NSDate){
debugPrint(“选择日期!\(日期)”)
}
func datePickerDidCancel(选择器:SMDatePicker){
调试打印(“日期选择器已取消”)
}
您从未设置SMDatePicker
的委托。此外,您还有两种格式副本didPickDate
。Swift中正确的语法是datePicker(uux0:didPickDate:)
,其中第二个参数是Date
,而不是NSDate
因此:
我个人会将SMDatePickerDelegate
方法放在它自己的扩展中
,只是为了保持代码的整洁和有序。此外,您的点击手势识别器可以声明为@objc
,而不是@IBAction
(后者表明您正在将其连接到Interface Builder中的一个动作(因此称为IB
),而您只是通过Objective-C#selector
模式将其连接起来)。谢谢Rob,我想我现在更了解这个过程了。我将采纳你的建议,并将其应用到其他一些课程中,作为加强你在这里教给我的内容的一种方式。非常感谢。给我一杯咖啡:)
class ViewController: UIViewController {
@IBOutlet weak var dateLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Initialize
let tap = UITapGestureRecognizer(target: self, action: #selector(didTapLabel(_:)))
dateLabel.isUserInteractionEnabled = true
dateLabel.addGestureRecognizer(tap)
// Set label date
let now = Date()
dateLabel.text = now.asString(style: .short)
}
@objc func didTapLabel(_ gesture: UITapGestureRecognizer) {
let picker = SMDatePicker()
picker.delegate = self // Don’t forget to set the delegate
picker.pickerMode = .date
picker.showPickerInView(view, animated: true)
print("tap working")
}
}
extension ViewController: SMDatePickerDelegate {
func datePicker(_ picker: SMDatePicker, didPickDate date: Date) {
dateLabel.text = date.asString(style: .short)
}
}