Ch.12 Gold: Pushing More View Controllers

# 아이템 생성 날짜 변경

  • 아이템의 생성 날짜를 변경할 수 있는 버튼을 만들어서, 버튼을 누르면 날짜를 변경할 수 있는 date picker 가 나오는 뷰로 연결하는 게 과제


# 새로운 뷰 컨트롤러 추가하기

  • 그냥 DetailViewController 에 버튼을 하나 추가해주고, 버튼을 누르면 CreationDateChangeViewController 로 넘어가도록 segue 를 추가해줬다.
class DetailViewController: UIViewController, UITextFieldDelegate {
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
        case "showCreationDate":
            let dateChangeViewController = segue.destination as! DateChangeViewController
            dateChangeViewController.item = item
        default:
            preconditionFailure("Unexpected segue identifier")
        }
    }
}

# Date Picker 커스터마이징

  • viewDidLoad() 에서 setDate(_:animated:) 메서드로 Date Picker 가 나타낼 날짜를 아이템의 생성 날짜로 설정해주고, 시간은 없애고 날짜만 보이도록 모드도 셋팅해줬다. 그리고 라벨도 아이템 이름에 따라 업데이트 해주고 싶어서 여기서 처리해줬다.
    • 사실 별 생각 없이 Item 의 didSet 에서 라벨을 업데이트했었는데 그렇게 했더니 아직 라벨 객체가 생성되기 전이라 터져서 고쳐줬다...
class DateChangeViewController: UIViewController {
    
    var item: Item!
    
    @IBOutlet weak var creationDateLabel: UILabel!
    @IBOutlet weak var creationDatePicker: UIDatePicker!
    
    @IBAction func creationDateChanged(_ sender: UIDatePicker) {
        item.dateCreated = sender.date
    }
    
    override func viewDidLoad() {
        creationDateLabel.text = "Creation Date for \(item.name) is"
        creationDatePicker.setDate(item.dateCreated, animated: false)
        creationDatePicker.datePickerMode = .date
    }
}

  • 고민이 됐던 점은 위에서 한 커마 작업을 사실 didSet 을 이용해서 각 객체가 생성된 순간에 해도 되지 않을까 했는데 뭔가 한 군데에서 처리하는 게 더 깔끔한가 싶어서 일단 그냥 viewDidLoad() 메서드에서 했다.
creationDateLabel: UILabel! { 
    didSet { 
        createDateLabel.text = "Creation Date for \(item.name) is" 
    }
}

좋은 웹페이지 즐겨찾기