【问题标题】:Implementing Delegate Protocol实现委托协议
【发布时间】:2020-06-09 02:23:04
【问题描述】:

我正在尝试实现委托协议,但显然我做错了。我正在使用 cocoapod:https://cocoapods.org/pods/SMDatePicker,我曾尝试联系开发人员寻求帮助,但到目前为止他从未回复我。

添加 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)

我的问题是我不知道如何实现这一点,任何帮助将不胜感激。

【问题讨论】:

    标签: swift delegates cocoapods protocols


    【解决方案1】:

    您从不设置delegateSMDatePicker。此外,您还有两个 didPickDate 的演绎版。 Swift 中的正确语法是datePicker(_:didPickDate:),其中第二个参数是Date,而不是NSDate

    因此:

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

    我个人会将SMDatePickerDelegate 方法放在它自己的extension 中,只是为了保持代码美观和有条理。此外,您的点击手势识别器可以声明为@objc,而不是@IBAction(因为后者建议您将其连接到Interface Builder 中的一个动作(因此是IB),而您只是在挂钩它是通过 Objective-C #selector 模式实现的)。

    【讨论】:

    • 谢谢 Rob,我想我现在更好地理解了这个过程。我将采纳您的建议并将其用于其他一些程序,以增强您在这里教给我的内容。非常感激。一杯乔在我身上:)
    【解决方案2】:

    首先,向CalculatorViewController 添加一个引用故事板/XIB 中的日期选择器的出口。

    然后,在 viewDidLoad() 中,将您的班级指定为其代表。

    @IBOutlet weak var datePicker: SMDatePicker!
    
    override func viewDidLoad() {
       self.datePicker.delegate = self
    }
    

    您添加为其委托的类必须符合您的示例所遵循的SMDatePickerDelegate 协议。

    然后,只需将方法添加到您的类中即可对其事件做出反应。例如:

    func datePicker(picker: SMDatePicker, didPickDate date: NSDate) {
        debugPrint("date picked! \(date)")
    }
    
    func datePickerDidCancel(picker: SMDatePicker) {
        debugPrint("date picker cancelled")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-10-23
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多