[英]Unable get the value from delegate swift
我是ios開發和敏捷的新手。 我遇到了一個問題。請幫助我解決這個問題。我使用一個自定義日期選擇器,因為我正在使用兩個標簽,標簽名稱分別是fromDateLbl和toDateLbl。我正在使用兩個按鈕fromDateBtn和toDateBtn。 如果我使用一個標簽和一個按鈕,則無法獲取日期,如果我使用兩個按鈕,則可以獲取日期。
請參閱以下代碼。
import UIKit
class SecondViewController: UIViewController {
@IBOutlet var fromDateLabel: UILabel!
@IBOutlet var toDateLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func fromDateAction(_ sender: Any) {
let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController
self.addChildViewController(popOverVC)
self.view.addSubview(popOverVC.view)
popOverVC.view.frame = view.bounds
popOverVC.delegate = self as? CustomDatePickerDelegate
popOverVC.didMove(toParentViewController: self)
self.navigationController?.navigationBar.isHidden = true
}
}
@IBAction func toDateAction(_ sender: Any) {
let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController
self.addChildViewController(popOverVC)
self.view.addSubview(popOverVC.view)
popOverVC.view.frame = view.bounds
popOverVC.delegate = self as? CustomDatePickerDelegate
popOverVC.didMove(toParentViewController: self)
self.navigationController?.navigationBar.isHidden = true
}
}
extension SecondViewController:CustomDatePickerDelegate
{
func CustomDateSeletced(value: String) {
fromDateLabel.text = value
}
}
secondVc代碼。
class CustomDatePickerViewController: UIViewController {
@IBOutlet var myDatePicker: UIDatePicker!
var delegate: CustomDatePickerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
view.frame.size.height = UIScreen.main.bounds.height
self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
}
@IBAction func saveDateAction(_ sender: Any) {
myDatePicker.datePickerMode = UIDatePickerMode.date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
let saveDate = dateFormatter.string(from: myDatePicker.date)
print("selectedDate",saveDate)
delegate?.CustomDateSeletced(value: saveDate)
self.removeAnimate()
self.navigationController?.navigationBar.isHidden = false
}
這是我的代表班。
import Foundation
protocol CustomDatePickerDelegate {
func CustomDateSeletced(value: String)
}
這不是完美的解決方案,但是下面的代碼可能會對您有所幫助。 為了改善一點,您可以使用UILabel操作並刪除UIButtons並存儲編輯后的標簽,這樣您就可以防止UILabel編輯。
Phillip Mills為您實施了更好的解決方案。
class SecondViewController: UIViewController {
@IBOutlet var fromDateLabel: UILabel!
@IBOutlet var toDateLabel: UILabel!
@IBOutlet var fromDateButton: UIButton!
@IBOutlet var toDateButton: UIButton!
var selectedButton: UIButton?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func selectDateAction(_ sender: Any) {
selectedButton = sender as? UIButton
let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController
self.addChildViewController(popOverVC)
popOverVC.delegate = self as? CustomDatePickerDelegate
present(popOverVC, animated: true, completion: nil)
self.navigationController?.navigationBar.isHidden = true
}
}
extension SecondViewController:CustomDatePickerDelegate
{
func CustomDateSeletced(value: String) {
if let button = selectedButton {
if button == toDateButton {
toDateLabel.text = value
} else {
fromDateLabel.text = value
}
selectedButton = nil
}
}
}
--
@IBAction func saveDateAction(_ sender: Any) {
myDatePicker.datePickerMode = UIDatePickerMode.date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
let saveDate = dateFormatter.string(from: myDatePicker.date)
delegate?.CustomDateSeletced(value: saveDate)
self.navigationController?.navigationBar.isHidden = false
dismiss(animated: true, completion: nil)
}
因為您的委托人不記得為什么調用了選擇器,所以您可能遇到委托協議可能不是最佳解決方案的情況。 這是您可以使用閉包代替的簡化版本。 這種策略可以使選擇器明確知道如何使用其生成的值。
class Second {
@IBOutlet var fromDateLabel: UILabel!
@IBOutlet var toDateLabel: UILabel!
@IBAction func fromDateAction(_ sender: Any) {
// Setup popover as before
let picker = Picker()
picker.useCompletion { (returnedDate) in
self.fromDateLabel.text = returnedDate
}
}
@IBAction func toDateAction(_ sender: Any) {
// Setup popover as before
let picker = Picker()
picker.useCompletion { (returnedDate) in
self.toDateLabel.text = returnedDate
}
}
}
class Picker {
var completion: ((String)->())?
func useCompletion(_ block: @escaping (String)->()) {
completion = block
}
@IBAction func saveDateAction(_ sender: Any) {
let saveDate = "The text you want to return"
if let completion = completion {
completion(saveDate)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.