我正在尝试通过' 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)可重用。这样,如果用户指定最小或最大日期,则用户只能从特定日期范围中选择。但如果没有指定,那么它将允许用户选择任何日期。
答案 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'
}
}
isDatePicker
是UIDatePicker
的布尔值,而不是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)
要检查的一些事项:
minimumDate
传递给"查看控制器2"。您的segue是否正确指定了标识符?您可以检查prepare for segue
方法中的以下代码行是否返回true?
if segue.identifier == "modal_datePicker"{
"查看控制器2"是否正确指定了标识符或子类?我认为这是modal_dateTimePickerVC
。
有些建议可能无法帮助解决这一特定问题,但值得一提的是:
ModalDateTimePickerVC
而不是modal_dateTimePickerVC
。一般情况下,您应该尝试使用可选绑定而不是强制解包,例如:
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)