Ich versuche, einen Datumswert von einem Ansichtscontroller über die Methode prepare(forSegue: ...) an ein Datumsauswahlmodal zu übergeben, das eine optionale Eigenschaft minimumDate und maximumDate aufweist. Der Wert von View Controller 1 wird jedoch nicht im Modal empfangen. Hier ist ein Beispielcode für das, was ich versuche:

Controller 1 anzeigen:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "modal_datePicker"{
        let datePickerModal = segue.destination as! modal_dateTimePickerVC
        datePickerModal.isDatePicker = true
        datePickerModal.maximumDate = Date()
    }
}

View Controller 2 (das Datumsauswahlmodal):

var minimumDate: Date?
var maximumDate: Date?

override func viewDidLoad() {
    super.viewDidLoad()

    if minimumDate != nil { //if minimum date was specified
        picker_workoutDateTime.minimumDate = minimumDate
    }

    if maximumDate != nil{
        picker_workoutDateTime.maximumDate = maximumDate
        print("Maximum date specified \(maximumDate)")
    }else{
        print("Maximum date NOT specified")
    }   
}

Im obigen Code versuche ich, das aktuelle Datum einzugeben, indem ich der Eigenschaft .maximumDate aus der Methode "Vorbereitung für den Übergang" in View Controller 1 Date() zuweist. In View Controller 2 überprüfe ich, ob Entweder wurden maximumDate und minimumDate mithilfe einer IF -Anweisung bereitgestellt, um zu überprüfen, ob ihre Werte Null sind. Es scheint, dass der Wert von View Controller 1 nicht von View Controller 2 empfangen wird.

Der ganze Grund, warum ich es so gemacht habe, ist, diesen modalen Dialog (View Controller 2) wiederverwendbar zu machen. Wenn der Benutzer ein minimales oder maximales Datum angibt, kann er nur aus einem bestimmten Datumsbereich auswählen. Wenn es jedoch nicht angegeben ist, kann der Benutzer ein beliebiges Datum auswählen.

0
Cris Denopol 17 Apr. 2018 im 13:56

4 Antworten

Beste Antwort

Ein paar Dinge zu überprüfen:

  1. "View Controller 1" übergibt kein minimumDate an "View Controller 2".
  2. Hat Ihr Segue die Kennung korrekt angegeben? Können Sie überprüfen, ob die folgende Codezeile in der Methode prepare for segue true zurückgibt?

    if segue.identifier == "modal_datePicker"{ 
    
  3. Hat "View Controller 2" die Kennung oder Unterklasse korrekt angegeben? Ich gehe davon aus, dass dies modal_dateTimePickerVC ist.

Einige Ratschläge, die diesem speziellen Problem wahrscheinlich nicht helfen, aber erwähnenswert sind:

  1. Im Allgemeinen sollten Klassennamen mit einem Großbuchstaben beginnen und Kamelbuchstaben verwenden, d. H. ModalDateTimePickerVC anstelle von modal_dateTimePickerVC.
  2. Im Allgemeinen sollten Sie versuchen, eine optionale Bindung anstelle eines erzwungenen Auspackens zu verwenden, z.

    if let datePickerModal = segue.destination as? modal_dateTimePickerVC {
    
0
Craig Grummitt 17 Apr. 2018 im 11:18

Sie sollten den Eigenschaften der zweiten Ansicht in der Methode prepareForSegue wie folgt einen Wert zuweisen:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "modal_datePicker"{
        let datePickerModal = segue.destination as! modal_dateTimePickerVC
        datePickerModal.maximumDate = Date()
        datePickerModal.minimumDate = 'some Date'
    }
}

isDatePicker ist der boolesche Wert von UIDatePicker und keine Eigenschaft von vc, es sei denn, Sie haben ihn in Ihrem zweiten viewController als Eigenschaft definiert.

0
Arash Etemad 17 Apr. 2018 im 11:08
if let viewControllerObject = UIStoryboard(name: "viewControllerName", bundle: nil).instantiateViewController(withIdentifier: "viewControllerName") as? viewControllerName {
           viewControllerObject.OptionalValueObject = "Data or string to pass"
    }

Sie können dies tun, um Daten zwischen 2 viewControllern zu übertragen

  • Um den viewController zu pushen, können Sie dies verwenden -

    navigationController? .pushViewController (viewControllerObject, animiert: true)

0
Rahul Singha Roy 17 Apr. 2018 im 11:13

Ich hatte ein ähnliches Problem mit Segues. Aus irgendeinem Grund war der Zugriff auf übergebene Daten nur innerhalb der Methode viewWillAppear anstelle von viewDidLoad möglich.

Es ist besser, solche Werte im Initialisierer zu übergeben. Leider können Sie dies nicht mit Segues tun. Sie können dies jedoch vermeiden, indem Sie den Controller manuell präsentieren und optionale Werte innerhalb der init-Methode von viewController übergeben.

func presentPicker() {
    let pickerVC = ModalDateTimePickerVC(asDatePicker: false, minDate: nil, maxDate: nil)
    self.present(pickerVC, animated: true, completion: nil)
}

class ModalDateTimePickerVC: UIViewController {
    var minimumDate: Date?
    var maximumDate: Date?
    var isDatePicker: Date

    init(asDatePicker isDatePicker: Bool, minDate: Date? = nil, maxDate: Date? = nil) {
        self.isDatePicker = isDatePicker
        self.minimumDate = minDate
        self.maximumDate = maxDate
    }
}

Sie können auch optionale Parameter weglassen und den Initialisierer wie ModalDateTimePickerVC(asDatePicker: true) aufrufen.

0
Bulat 18 Juni 2019 im 13:03