Swift 实现委托协议

Swift 实现委托协议,swift,delegates,cocoapods,protocols,Swift,Delegates,Cocoapods,Protocols,我试图实现一个委托协议,但显然我做得都不对。我正在使用cocoapod:,我试图联系开发人员寻求帮助,但到目前为止,他从未回复我 在我添加并安装了pod之后,我将.swift文件添加到我的项目中,并添加了以下方法,该方法可以很好地显示日期选择器: class CalculatorViewController: UIViewController, SMDatePickerDelegate { @IBOutlet weak var lblDate: UILabel! override func

我试图实现一个委托协议,但显然我做得都不对。我正在使用cocoapod:,我试图联系开发人员寻求帮助,但到目前为止,他从未回复我

在我添加并安装了pod之后,我将.swift文件添加到我的项目中,并添加了以下方法,该方法可以很好地显示日期选择器:

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)
    }
}