Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] #216 - 대기방에서 뷰 dismiss 분기처리 #217

Merged
merged 5 commits into from
Jan 28, 2022

Conversation

hyun99999
Copy link
Member

@hyun99999 hyun99999 commented Jan 27, 2022

🌴 PR 요약

🌱 작업한 브랜치

🌱 작업한 내용

  • 대기방에서 dismiss 하는 분기처리
  • FromWhereStatus 를 통해서 열거형으로 분기처리
/// 대기방을 접근하는 플로우를 알려주는 상태.
/// - fromHome : 홈에서 대기방 올 때.
/// - joinCode : 코드로 참여할 때.
/// - makeRoom : 방만들기로 대기방 올 때.

@frozen
enum FromWhereStatus {
    case fromHome
    case joinCode
    case makeRoom
}

📌 참고 사항

  • 코드로 참여할 때 presenting view controller 를 로그로 찍어봤다.

스크린샷 2022-01-27 오후 7 01 40

지금은 스플래쉬 | 홈 | 코드입력팝업 | 코드참여 확인뷰 | 대기방

구조이고, 우리는 presentingViewController?.presentingViewController 이렇게 사용해서 코드참여 확인뷰를 닫고, 코드입력팝업을 닫으려고 했어요! 하지만 그렇지를 못했져 이유를 알아봅시다..

화면을 dismiss 로 걷어내는 객체는 해당 뷰컨이 아니라구 해여! VC1이 VC2를 불렀다고 가정한다면, VC2가 화면에서 걷어지기 위해서는 VC1가 걷어줘야하는거죠!
어라..? 그러면 self.dismiss 가 아니라 self.presentingViewController.dismiss 를 써야하는거 아닌가요?
에 대한 답변으로 사용자의 관점에서 전혀 차이를 느낄 수 없다고 해여

 두 함수의 차이는 completion 함수 구현 시 발생한다.
dissmiss를 한 이후에 결과를 presentingViewController에게 알려주느냐 아니면 사라진 ViewController(self)에게 알려주느냐의 차이가 있다.

그래서 코드 입력하는 팝업창을 부르는 presentingViewController?. presentingViewController?. presentingViewController? 에서 dismiss 를 해주어야했던 것이지요.

참고: https://velog.io/@ellyheetov/화면전환

개발자 문서를 찾아볼게여~

dismiss(animated:completion:)

Dismisses the view controller that was presented modally by the view controller.

Parameters

  • falg

transition 에 애니메이션을 적용하려면 true 를 전달해야한다.

  • completion

뷰 컨트롤러가 dismiss 된 후 실행할 블록이다.

Discussion

presenting view controller 는 자신이 present 한 뷰컨트롤러를 닫을 책임이 있습니다. presented view controller 자체에서 이 메서드를 호출하면 UIKit 는 presenting view controller 에게 해제를 처리하도록 요청합니다.

여러 뷰컨트롤러를 연속적으로 present 해서 presented view controller 스택을 구축하는 경우, 스택의 낮은 뷰컨트롤러에서 이 메서드를 호출하면 바로 자식 뷰컨트롤러와 위의 모든 뷰컨트롤러가 해제됩니다.

이런일이 발생하면, 맨위의 뷰만 애니메이션 방식으로 닫힙니다. 중간 뷰컨트롤러는 스택에서 간단히 제거됩니다. 맨위의 뷰는 modal transition stlye 을 사용하여 dismiss 됩니다. 이 스타일은 스택의 다른 하위 뷰컨트롤러에서 사용하는 것과 다를 수 있다.

만약 presented view controller 에 대한 참조를 유지하려면 이 메서드를 호출하기 전에 presentedViewController 속성의 값을 가져와야 합니다.

completion 핸들러는 presented view controller 에서 viewDidDisappear(_:) 메서드 호출된 다음에 호출됩니다.

참고: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss

📸 스크린샷

기능 스크린샷
기능

📮 관련 이

@hyun99999 hyun99999 added Fix 오류 해결, 코드 수정 👼타락pOwEr천사현규 크로아서버 환영요 P1 / Priority High labels Jan 27, 2022
@hyun99999 hyun99999 self-assigned this Jan 27, 2022
Copy link
Member

@L-j-h-c L-j-h-c left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감자후배를 위해서 이렇게 정리해주시고 진짜 무한한 감사.. 대우주꿀팁 잘받아갑니다

@@ -102,6 +123,8 @@ class WaitingVC: UIViewController {
rightButtonImage: UIImage(),
reftButtonSelector: #selector(dismissToHomeVC),
rightButtonSelector: #selector(touchToMore))
case .none:
print("fromeWhereStatus 를 지정해주세요.")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와울... enum으로 정리해주니까 너무 깔끔해보여요!! 체고시다 선배..

Comment on lines +340 to +349
switch self.fromWhereStatus {
case .fromHome:
self.popToHomeVC()
case .makeRoom:
self.dismissToHomeVC()
case .joinCode:
// 코드로 참여시에는 createButton 이 히든되어 있어서 아무런 동작이 필요하지 않다.
return
case .none:
print("fromeWhereStatus 를 지정해주세요.")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이유는 알수 없지만 개인적으로 if else보다는 switch case가 훨씬 가독성이 좋네요. case에서 정보를 유추할 수 있어서 그런감..

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그런거 같아요! 기존에는 fromHome 이라는 bool 자료형으로 구분을 했는데 선택지가 3개를 고려해야했고 그러면서 자연스럽게 열거형을 사용하려했어요!


@objc
func dismissJoinCodeToHomeVC() {
presentingViewController?.presentingViewController?.presentingViewController?.dismiss(animated: true)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아아앗 self.presentingViewController?.dismissself.dismiss가 사용자가 보기에는 똑같이 보이고, completion의 작동에서만 차이가 있다.
따라서 전전의 뷰를 포함해서 dismiss하려면 presenting을 3번을 써줘야 하는거죠??
진짜 대우주꿀팁 킹갓현규섬배..

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맞아여 등장한 뷰컨에서 dismiss 하면 UIKit 은 등장시킨 뷰컨에게 해제를 요청하고, 결국 등장시킨 뷰컨에서 dismiss 를 해도 같은 의미가 되니까 그렇게 됐던거 같아여!
dismiss 도 찾아볼 이유가 되네.. 하면서 조금 이마 탁치면서 공부했어여 저도

Copy link
Member

@yangsubinn yangsubinn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전에 bool 변수 사용해서 했던 것보다 훨씬 깔끔하고 좋네요.. 역시 ........ 깔끔한 정리 감사합니다!🙆‍♀️⚡️

@hyun99999 hyun99999 merged commit 04ea3cd into TeamSparker:develop Jan 28, 2022
@hyun99999 hyun99999 deleted the feature/#216 branch February 1, 2022 15:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Fix 오류 해결, 코드 수정 P1 / Priority High 👼타락pOwEr천사현규 크로아서버 환영요
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Fix] 대기방에서 뷰 dismiss 분기처리
3 participants