2017-01-08 1 views
1

약 3 시간 동안 UIDatePicker에 내가 원하는 것을하기 위해 노력했습니다. 나는 UITextField의 동작으로 설정하여 UIDatePicker으로 새로운보기 컨트롤러에 연결합니다. 이것은 모두 작동합니다. 날짜를 선택하고 원래보기 컨트롤러로 다시 보낼 수있었습니다.간격이 5 분인 UIDatePicker가 간격을두고 나타납니다.

문제는 5 분의 시간 간격을 사용하고 있다는 것입니다. 날짜 선택 도구 "바퀴"을 이동하지 않고 부모 컨트롤러로 돌아 가기 위해 내 완료 버튼을 선택하면 비 간격 시간이 반환됩니다. 그래서 11시 37 분 11시 40 분이 필요할 때 11시 37 분 반환합니다. 그러나 "바퀴" 변경하면 반올림 된 시간을 반환합니다. datepicker가 현재 5 분 간격을 표시하고 있습니다. 올바른 해결책을 찾는데 필요한 단서가 있습니까? viewDidAppear에서 setDateminuteIntervalUIDatePicker에 시도했지만 아무 소용이 없습니다.

protocol DatePickerDelegate { 
    func datePickerDidSelect(selectedDate: String) 
} 

class DatePickerVC: UIViewController { 

@IBOutlet weak var pickerView: UIDatePicker! 

var selectedDate = "" 
var delegate : DatePickerDelegate? 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewDidAppear(_ animated: Bool) { 
    //setDate() 
    //Have tried using setDate and minuteInterval here 
} 

func formatDate() -> DateFormatter { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMM d, yyyy h:mm a" 
    return dateFormatter 
} 

func setDate() { 
    let dateFormatter = formatDate() 
    selectedDate = dateFormatter.string(from: pickerView.date) 
    self.delegate?.datePickerDidSelect(selectedDate: selectedDate) 
    print(selectedDate) 
} 

@IBAction func datePickerChanged(_ sender: Any) { 
    setDate() 
} 

@IBAction func doneBtnPressed(_ sender: Any) { 
    self.dismiss(animated: true, completion: nil) 
} 

@IBAction func cancelBtnPressed(_ sender: Any) { 
    self.dismiss(animated: true, completion: nil) 
} 
} 

답변

2

는이 같은 여러분의 필요에 날짜와 그 둘레를 확인할 수 있습니다 :

override func viewDidLoad() { 
    super.viewDidLoad() 

    let calendar = Calendar.current 
    var dateComponents = calendar.dateComponents([.month, .day, .year, .hour, .minute], from: datePicker.date) 
    guard var hour = dateComponents.hour, var minute = dateComponents.minute else { 
     print("something went wrong") 
     return 
    } 

    let intervalRemainder = minute % datePicker.minuteInterval 
    if intervalRemainder > 0 { 
     // need to correct the date 
     minute += datePicker.minuteInterval - intervalRemainder 
     if minute >= 60 { 
      hour += 1 
      minute -= 60 
     } 

     // update datecomponents 
     dateComponents.hour = hour 
     dateComponents.minute = minute 

     // get the corrected date 
     guard let roundedDate = calendar.date(from: dateComponents) else { 
      print("something went wrong") 
      return 
     } 

     // update the datepicker 
     datePicker.date = roundedDate 
    } 
} 

아무것도 불분명 물어 주시기 아래는 내가 사용 된 코드입니다!

+0

나는 이것을 작동 시키지만, datePicker.date = roundedDate를 datePicker.setDate (roundedDate, animated : false)로 변경해야만한다. 그러나 그 동안에는 실제로 시간이 선택/변경 될 때까지 완료 버튼을 비활성화하기로 결정했습니다.이 앱에서 가능성이 높기 때문에 지금 시작 시간을 선택하지 않을 것입니다. – user1881482

관련 문제