Singleton 관련 질문

안녕하세요! 유튜브로 알게되어서 이렇게 질문을 올립니당!

일단 뷰1, 뷰2, 뷰3 이렇게 세 개의 뷰가 있습니다.

뷰 1에는 아이디와 비밀번호 입력 필드가 있고 아래에 회원가입 버튼이 있습니다. 이 회원가입 버튼을 누르면 모달 형식으로 뷰 2를 띄웁니다.
(뷰 2와 3은 네비게이션 컨트롤러로 연결되있음)
(아이디 입력필드는 IBOutlet으로 var userId: UITextField?으로 선언)

뷰 2는 사용할 아이디와 비밀번호를 입력받고 이 두 가지 필드 모드 값이 있으면 ‘다음’ 버튼을 눌러 뷰 3으로 넘어갑니다.

이때! 다음 버튼을 누르면

이런 식으로 Singleton방식으로 구현된 클래스의 프로퍼티에 아이디에 저장된 텍스트를 저장합니다.
(signUpIdField는 UITextField사용)

그리고 뷰 3에서 추가적으로 정보를 입력받고 ‘완료’ 버튼을 누르면 뷰 1로 돌아가고 아까 입력했던 아이디가 화면1의 아이디 필드에 입력되어있습니다. 저는 이때 뷰 1의 id (UITextField) 란에 아까 Singleton 클래스에 저장해두었던 id값을 저장하는 방식을 사용할려고 합니다.

근데 이상하게 저장이 안되요 ㅠㅠㅠㅠㅠㅠㅠ
이 문제에 거의 1주일을 매달렸는데 더 이상의 고민은 의미가 없는 것 같아 이렇게 질문을 올립니다. ㅠㅠ
위와 같이 옵셔널 바인딩 말고 그냥 firstViewController.userID?.text = UserInformation.shared.ID로도 해보고 viewWillDisappear에 넣어보고 별 짓을 다 해봤는데 마찬가지 입니다.
(아 참고로 var firstViewController = ViewController() 로 위에 따로 선언해뒀습니다.)

이렇게 디버깅을 해보면 클래스에 값은 저장되어 있는데 이상하게 첫 번째 뷰에 있는 userId에는 저장이 안되네요 ㅠㅠ

이건 제가 구현한 Singleton 클래스입니다.

이렇게 좋은 커뮤니티가 있는 줄 몰랐네요! 아직 실력은 미천하지만 앞으로 자주 들려서 글도 올리고 활동도 하겠습니다~ 감사합니다!

좋아요 1

안녕하세요, 반갑습니다.

일단, UserInformation이 class 네요. 그럼 shared 가 let으로 만들어져도 ID는 수정이 되는 게 맞죠.

뭔가 지금 설명하지 않은 부분에서 에러가 나 있을 가능성이 있는데요,

이 문제만 독립시킨 프로젝트를 만들어서 문제를 재현해서 올려주시면 한 번 볼께요.

좋아요 1

예 선생님! 근데 파일 첨부는 어떻게 하나요?

http://codershigh.dscloud.biz:30004/t/viewcontroller-class/26

이 글에서처럼 구글 드라이브나 박스 공유폴더에 파일을 올리고 링크 거시면 됩니다.

좋아요 1

https://drive.google.com/open?id=1yCOljnwE6_CNHO1izwoE53Mvad0jS8NH

올렸습니다~

역시 싱글톤의 문제는 아니었고, UI 업데이트에 대한 문제였네요.

모달을 내리면서 아래쪽 presenting View Controller 에 값을 제대로 전달하지 못한 거죠.

unwind 세그웨이로 푸는 게 깔끔해 보이네요.

수정한 샘플코드 올려드립니다.

https://app.box.com/s/hl6ehdtrm8hynriv1jcyqell8tkvw5ao

그리고 언와인드 세그웨이 또는 모달의 프리젠팅 관련한 내용은 아래 동영상 강좌에서 보시면 됩니다.

https://programmers.co.kr/learn/courses/4

중 파트 7 모달 컨텍스트 부분을 보세요

좋아요 1

감사합니다 선생님! 제가 뷰 간의 데이터 전송부분을 생각을 못 했네요 ㅠㅠ

근데 제가 아래와 같은 환경에서는 별 문제 없이 됬었습니다.


뷰 1과 뷰 2가 존재합니다. (모달없이 네비게이션 컨트롤러로 연결.)
뷰 1에는 UITextField한 개와 UIButton한 개가 있습니다. 이 버튼을 누르면 다음 뷰로 show 방식으로 넘어갑니다.
뷰 2에는 텍스트필드 한개와 버튼 한개가 있습니다. 그리고 텍스트 필드에 글자를 입력하고 버튼을 누르면 싱글턴 클래스에 텍스트가 저장됩니다. 그리고 뒤로가기 버튼을 누르면 뷰 1에 있는 텍스트 필드에 입력했던 텍스트가 저장되어 있습니다.
(뷰 1의 viewWillAppear메소드에 불러오는 코드 구현)

따로 unwind를 사용하지 않았다는 것이죠. 제가 이해한 바로는 네비게이션 컨트롤러를 이용하면 뷰 간에 관계가 명확합니다. 그래서 이전 뷰로 돌아갈때 어떤 뷰로 돌아갈지 명확합니다. (그래서 별 문제없이 데이터를 줄 수 있음)
하지만 모달을 사용하면 그냥 pop up 행위를 할 뿐입니다. (값 전달시 오류가 발생 할 수 있음.)
제가 이해한 것이 맞나요?? ㅠㅠ
늦은시간에 감사합니다!

안녕하세요, Swift를 공부한지 얼마 되지 않은 학생입니다 ㅎㅎ 열심히 공부중이죠.

아마 말씀해주신 환경에서 별 문제 없이 된 이유는 뷰1과 뷰2가 segue로 연결되어 있어서 값을 전달할 수 있었기 때문이라고 생각이 듭니다. 저도 정확한 이유는 잘 모르겠지만 show 방식으로 연결된 segue 사이에서의 값 전달은 바로 앞이나 뒤로만 전달이 가능하더라고요. 아마 이런 문제때문에 skyoon님이 unwindSegue라는 것을 제안하지 않으셨나 싶습니다. unwindSegue가 바로 이러한 문제점을 해결해주더라고요.

예를 하나 들어보겠습니다.
뷰1, 뷰2, 뷰3가 있습니다. 뷰1, 뷰2, 뷰3는 각각 show 형식의 segue로 연결되어 있습니다. 이때 뷰1과 뷰2 그리고 뷰2와 뷰3간에는 데이터 전달이 무리없이 될 것이라고 생각이 듭니다. 하지만 뷰3에서 뷰1으로 전달을 할때에는 제대로 값이 전달하지 못할 것입니다. 이게 skyoon님이 답변하셨던 아래쪽 presenting View Controller에 값을 “제대로” 전달하지 못한 것과 비슷하지 않을까? 생각이 듭니다. 이를 해결하기 위해서는 뷰1에 @IBAction func functionName(segue:UIStoryboardSegue) {}라는 도달점을 명시하는 함수를 하나 만들어놓고, 뷰3에서 Exit으로 연결 후 prepareForSegue로 뷰1에 값을 전달해야되지 않나 싶습니다. (자세한 것은 skyoon님의 첨부자료와 링크를 통해 확인해주세요 ㅎㅎ)

http://codershigh.dscloud.biz:30004/t/viewcontroller-class/26

위 글을 읽어보시면 조금 더 이해가 되지 않을까 생각이 듭니다.
@dragonhead 님께서 올려주신 코드를 보지 못한체 설명만으로 작성하여 설명이 부족할 수도 있습니다. 부족한 설명 읽어주셔서 감사합니다

좋아요 1

자세한 답글 감사합니다! Segue에 대해 더 공부해봐야겠습니당. 같이 열심히 해요~

좋아요 1