📱 iOS 플젝 개발일지

[iOS/Swift] 사이드프로젝트 버그 정리

dev_zoe 2022. 10. 2. 15:13
반응형

1. 처음 회원가입 후 진입시에 API가 동작하지 않는 현상

- 원인 : API에 사용되는 헤더(jwt값)가 'static' 즉 정적변수이기때문에 프로그램 처음 실행할 때 한 번 값이 할당된 이후에는 값이 바뀌지 않음

reference : https://wikidocs.net/228

 

 

07-03 정적(static) 변수와 메소드

이번에는 스태틱(static)에 대해서 알아보자. [TOC] ## static 변수 예를 들어 다음과 같은 HouseLee 클래스가 있다고 하자. *Sample. ...

wikidocs.net

- 해결 : 앱 실행 후에 회원탈퇴 후 재가입 혹은 기타 계정으로 로그인하는 경우까지 고려해야하므로 정적이 아닌 동적 변수로 선언 후 동적으로 값 할당

 

2. 텍스트필드가 키보드에 의해 가려지는 현상

- 해결 1 : 빈 곳을 누르면 키보드가 내려가게 처리해야함

    func dismissKeyboardWhenTappedAround() {
        let tap =
            UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
//        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(false)
    }

 

- 해결 2 : 키보드를 입력할 때 텍스트필드도 같이 올라가게 처리

reference : https://developer-fury.tistory.com/22

    override func viewDidLoad() {
    ... 위 생략

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)

    }
    
    @objc
    func keyboardWillShow(_ notification: Notification) {
        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRectangle = keyboardFrame.cgRectValue
            let keyboardHeight = keyboardRectangle.height
            chatBackGround.frame.origin.y -= keyboardHeight
        }
    }

    @objc
    func keyboardWillHide(_ notification: Notification) {
        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRectangle = keyboardFrame.cgRectValue
            let keyboardHeight = keyboardRectangle.height
            chatBackGround.frame.origin.y += keyboardHeight
        }
    }

3. 위와같이 처리하였는데, 텍스트필드에서 입력하면 입력창이 사라지는 현상 (해결중)

- 현상 : 입력하지 않은 상태로 빈 공간을 터치했다가 textView에 포커스를 더하면 문제가 없는데, 입력할 때에 textView가 갑자기 사라짐 (화면 아래쪽으로 사라지는것처럼 보임)

- textViewDidChange에서, button의 이미지를 바꾸는 부분을 주석처리하니 해당 현상이 사라지는것으로 보아 이미지를 setting하는 곳에서 문제가 있는 것으로 보임

 

4. 출석 관리하기/확인하기 화면에 누르면 화면이 여러번 이동하는 이슈

Problem : cell의 버튼이 클릭되었을 때, 여러 셀에게 인식이 되어 여러번 실행하는 것으로 짐작

            cell.manageButton.rx.tapGesture()
                .when(.recognized)
                .map { _ in
                    return indexPath.row
                }
                .bind(to: self.viewModel.inputs.manageAttendance) // indexPath.row 넘겨주기 -> 작성한 글 인덱스
                .disposed(by: disposeBag)

reference : 

https://velog.io/@gagoilkim/RxDatasources%EC%97%90%EC%84%9C-Multiple-Tap-%ED%98%84%EC%83%81-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

 

disposeBag을 cell의 disposebag을 사용하여 dispose 시키는 방향으로 수정

            cell.manageButton.rx.tapGesture()
                .when(.recognized)
                .map { _ in
                    return indexPath.row
                }
                .bind(to: self.viewModel.inputs.manageAttendance) // indexPath.row 넘겨주기 -> 작성한 글 인덱스
                .disposed(by: cell.disposeBag)

 

5. cell의 data가 섞이는 현상 (ex. 첫번째 글을 눌렀는데 세번째 글로 이동)

- 이유 : API를 불러올 때 순서와 작성한 글 리스트 순서가 서로 맞지 않아 다른 글이 불러와지는 현상

- Problem : 작성한 글은 API에서 불러오는 순서와는 달리 모임 시간이 최신 순으로 되어있기 때문에, indexPath.row와 불일치하였음.

- Solve : indexPath.row는 그대로 받되 이동하는 화면에서 API 에서 불러오는 글을 모임 시간 최신순으로 글을 정렬하여, 해당 인덱스로 접근


                    if response.isSuccess {
                        let sortedResult = response.result?.myPosting?.sorted(by: { $0.gatheringTime! > $1.gatheringTime! })
                        viewController.didSuccessGetManageAttendance(myPosting: sortedResult ?? [])
                    } else {
                        viewController.failedToRequest(message: response.message)
                    }
... 이후 생략

 

반응형