ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 201231- TIL
    TIL/2021 2021. 1. 1. 03:37

    iOS

     

    Data pass

     

    어제 구현했던 unwind segue를 이용한 B -> A 데이터 이동 방식은 B에서 A의 속성에 바로 접근할 수 있다는 장점이 있었지만 coupling 개념에 있어서 좋지 못했다. 그래서 다시 구현한 방식은 notification을 이용한 방법!

     

    B에서 notification을 send하고 A에서 observer를 만들어 캐치하면 됐다! 이때 정보는 userinfo에 담아서 보내면 된다.

     

    extension NSNotification.Name {
        static let DateValueDidChange = NSNotification.Name("DateValueDidChangeNotification")
    }

    B에 이렇게 이름을 추가하고

     

        @IBAction func save(_ sender: Any) {
            let walkDate = self.koreaDateFormatter.string(from: walkDatePicker.date)
            let walkTime = self.koreaTimeFormatter.string(from: walkTimePicker.date)
            
            let walkDateAndTime = [walkDate, walkTime]
            
            NotificationCenter.default.post(name: NSNotification.Name.DateValueDidChange, object: nil, userInfo: ["WalkDateAndTime": walkDateAndTime])
            
            dismiss(animated: true, completion: nil)
        }

    두가지 데이터를 한 번에 담아서 보내야 했기 때문에 배열로 만들어서 보냈다.

    그럼 A에서 이제 notification을 받으면 된다.

     

            NotificationCenter.default.addObserver(self, selector: #selector(changeWalkDateAndTimeLabel(notification:)), name: NSNotification.Name.DateValueDidChange, object: nil)

    이렇게 observer를 추가하고 parameter로 받는 selector도 구현하면 끝!

     

        @objc func changeWalkDateAndTimeLabel(notification: Notification) {
            guard let walkDateAndTime = notification.userInfo?["WalkDateAndTime"] as? [String],
                  let walkDate = walkDateAndTime.first,
                  let walkTime = walkDateAndTime.last else {
                return
            }
            
            self.walkDateAndTimeLabel.text = "\(walkDate)\n\(walkTime)"
        }

    이렇게 하면 데이터를 받아와서 A에서 그 데이터를 사용할 수 있다.

     

     

     

    Unwind Segue

     

    홈 화면에서 3단계나 떨어져 있는 화면에서 바로 홈 화면으로 이동하고 싶었다.

    문제는 돌아가기전에 alert으로 물어보고 확인을 누르면 이동을 하고 싶었는데 unwind를 storyboard에서 연결시키면 alert으로 물어보고 이동시킬 수 없었다.

     

    처음 생각한 방식은 dismiss를 두번을 하고 tabbarController의 selectedIndex 속성을 이용하여 홈으로 가는 방법!

    구현을 했는데 중간에 딜레이가 발생했다. animated를 fasle로 했는데도 누가 봐도불필요한 화면이 보이면서 화면이 넘어갔다.

    그래서 이 방법도 실패!

     

    그래서 unwind segue를 programmatically하게 구현하는 방법을 찾아보았다.

    Unwind segue를 옮겨야 할 화면에서 file's owner 아이콘에서 exit 아이콘으로 드래그해서 생성한 뒤 identifier를 정해주고 performSegue(withIdentifier:)로 구현하면 됐다.

     

        @IBAction func cancel(_ sender: Any) {
            self.presentTwoButtonAlert(alertTitle: "기록을 중지하시겠어요?", message: "중지하시면 현재 데이터가 삭제됩니다.", confirmActionTitle: "확인", cancelActionTitle: "취소") {_ in
                
                self.performSegue(withIdentifier: "unwindToHome", sender: self)
            }
        }

     

    간단간단!

     

     

    어.. 녹화 화면에서 잠깐 불필요한 화면이 보이지만 실제로 사용해보면 못 느낀다... 

    이전 코드는 딜레이가 1초는 됐지만 지금은 거의 없다.

    728x90

    'TIL > 2021' 카테고리의 다른 글

    210104 - TIL  (0) 2021.01.05
    211003 - TIL  (0) 2021.01.04
    201230 - TIL  (1) 2020.12.31
    201228 - TIL  (0) 2020.12.29
    201226 - TIL  (0) 2020.12.27
Designed by Tistory.