如何将值传递给另一个viewcontroller

时间:2018-04-17 10:56:31

标签: ios swift

我正在尝试通过' prepare(forSegue:...)'从视图控制器传递日期值。日期选择器模式的方法,它具有可选的minimumDate和maximumDate属性。但是在模态中没有接收到来自视图控制器1的值。这是我想要做的示例代码:

查看控制器1:

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

查看控制器2(日期选择器模式):

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

在上面的代码中,我试图通过将View()分配给View Controller 1中的prepare for segue方法的.maximumDate属性来放入当前日期。在视图控制器2中,我检查是否有maximumDate和minimumDate是使用IF语句提供的,检查它们的值是否为nil。看来视图控制器2没有接收到来自视图控制器1的值。

我这样做的全部原因是使这个模态对话框(视图控制器2)可重用。这样,如果用户指定最小或最大日期,则用户只能从特定日期范围中选择。但如果没有指定,那么它将允许用户选择任何日期。

4 个答案:

答案 0 :(得分:0)

您应该在prepareForSegue方法中为第二个视图属性赋值,如下所示:

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

isDatePickerUIDatePicker的布尔值,而不是vc的属性,除非您在第二个viewController中将其定义为属性。

答案 1 :(得分:0)

if let viewControllerObject = UIStoryboard(name: "viewControllerName", bundle: nil).instantiateViewController(withIdentifier: "viewControllerName") as? viewControllerName {
           viewControllerObject.OptionalValueObject = "Data or string to pass"
    }

您可以这样做以在2个viewControllers之间传递数据

  • 推送viewController,你可以使用它 -

    navigationController?.pushViewController(viewControllerObject,animated:true)

答案 2 :(得分:0)

要检查的一些事项:

  1. "查看控制器1"没有将minimumDate传递给"查看控制器2"。
  2. 您的segue是否正确指定了标识符?您可以检查prepare for segue方法中的以下代码行是否返回true?

    if segue.identifier == "modal_datePicker"{ 
    
  3. "查看控制器2"是否正确指定了标识符或子类?我认为这是modal_dateTimePickerVC

  4. 有些建议可能无法帮助解决这一特定问题,但值得一提的是:

    1. 一般来说,班级名称应以大写字母开头并使用驼峰案例,即ModalDateTimePickerVC而不是modal_dateTimePickerVC
    2. 一般情况下,您应该尝试使用可选绑定而不是强制解包,例如:

      if let datePickerModal = segue.destination as? modal_dateTimePickerVC {
      

答案 3 :(得分:0)

我使用segues遇到了类似的问题。由于某些原因,只能在viewWillAppear方法内部访问传递的数据,而不是viewDidLoad。

最好在初始化程序中传递这些值。不幸的是,你不能使用segues。但是你可以通过手动呈现控制器并在viewController的init方法中传递可选值来避免这种情况。

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

您还可以省略可选参数并调用初始值设定项,如ModalDateTimePickerVC(asDatePicker: true)