簡體   English   中英

無法從委托swift獲取值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM