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

[FEAT] iOS 1차 과제 #2

Merged
merged 14 commits into from
Apr 14, 2022
Merged

[FEAT] iOS 1차 과제 #2

merged 14 commits into from
Apr 14, 2022

Conversation

513sojin
Copy link
Member

@513sojin 513sojin commented Apr 9, 2022

🌱 작업한 내용

기본 과제

  • UI 구현 ( 로그인 화면 / 회원가입 화면 / 완료 화면 )
  • 화면 전환
  • 데이터 전달

도전 과제

  • TextField에 값 입력시 버튼 띄우기
  • TextField에 값이 모두 입력된 경우 로그인 버튼 활성화

심화 과제

  • 로그인 화면 : 눈 모양 아이콘 클릭시 비밀번호 노출 여부 결정

🌱 PR Point

  • 화면가입 화면(1)에서 완료화면으로 데이터를 넘길 때 중간에 화면가입 화면(2)를 거치는 방법으로 진행했는데 올바르게 하고있는지
    (바로 연결되어 있지않은 VC간 데이터를 전달할 때는 보통 어떤 방식을 많이 활용하는지 궁금해요)
  • PR 포인트라고 하기엔 아쉬운데,, 포크해온 레포에서 브랜치 따서 작업해버려서 513sojin:feature/[FEAT] iOS 1차 과제 #1 에서 main으로 PR보냈습니다

📸 스크린샷

구현 내용 스크린샷
로그인 화면 ios1assign
회원가입 화면 ios2

📮 관련 이슈

Copy link
Member

@jane1choi jane1choi left a comment

Choose a reason for hiding this comment

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

남겨준 질문에 대해 답변을 조금 하자면,,
데이터 전달 방식에 정답은 없는 것 같아요! 본인이 생각하기에 효율적인 방식으로 데이터를 전달하면 된다고 생각하는데,
우리가 1주차 세미나에서는 프로퍼티를 이용한 VC간 화면 전달 방법밖에 배우지 않았기 때문에
소진님이 하신 방법 너무 잘했다고 생각해요!(저도 이 방법으로 구현했습니다)
그런데 일반적인 데이터 전달 방법에 더 궁금하다고 하셔서 몇가지 남겨볼게요!

특히 userName과 같이 앱 내에서 전역적으로 많이 쓰이는 값을 효율적으로 저장하고, 꺼내 쓸 수 있는 방법에
UserDefault와 싱글톤 패턴 이렇게 두 가지 좋은 방법이 있다고 생각하는데요,
간단하게 설명하자면 UserDefault는 앱 내 데이터 저장소라고 할 수 있을 것 같고,
싱글톤 패턴은 디자인 패턴 중 생성 패턴에 해당하는 디자인 유형으로 클래스가 여러 차례 호출되더라도 딱 한 객체만 생성되기 때문에
객체를 하나만 생성하여 여러 곳에서 공용으로 사용하고 싶을 때 사용하는 디자인 패턴이라고 할 수 있을 것 같아요!
더 자세한 내용이 궁금하실 수 있으니 제가 티스토리에 정리해놓은 자료 링크 두고 가겠습니다! 참고하시면 좋을 것 같아요😊
https://janechoi.tistory.com/2
https://janechoi.tistory.com/4

도전, 심화과제까지 1차 과제 너무 수고하셨습니다🔥


override func viewDidLoad() {
super.viewDidLoad()
configUI()
Copy link
Member

Choose a reason for hiding this comment

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

우리 조 컨벤션 정할 때 configureUI()로 맞췄던 것 같은데 이번주는 패쓰하고 요거 담주에 바꿔봐도 좋을 것 같아요!


[emailTextField, passwordTextField].forEach {
$0?.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
}
Copy link
Member

Choose a reason for hiding this comment

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

forEach로 한번에 처리 너무 잘했는데!
viewDidLoad()와 같은 생명 주기 함수 안에는 함수 호출 구문만 써주는 것이 좋습니다!(코드의 가독성을 위해)
그래서 협업 시 대부분 기본 컨벤션으로 가져가는 것 같아요! 요 부분은 함수로 따로 빼서 호출하는 식으로 바꿔봅시다!

Copy link
Member

Choose a reason for hiding this comment

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

forEach로 처리한 거 너무 좋네요 쇽샥 해가겠습니다 ~


emailTextField.borderStyle = .roundedRect
passwordTextField.borderStyle = .roundedRect
//TODO : textField의 크기를 지정해주고 싶다 !
Copy link
Member

Choose a reason for hiding this comment

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

textField 크기는 이제 우리 AutoLayout 배웠으니 담주에 과제에서 설정해봅시다😊

override func viewDidLoad() {
super.viewDidLoad()
configUI()
self.userNameTextField.addTarget(self, action: #selector(self.userNameTextFieldDidChange(_:)), for: .editingChanged)
Copy link
Member

Choose a reason for hiding this comment

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

요부분도 함수로 따로 빼봅시다~!

func configUI(){
welcomeText.text = "언제든지 연락처 정보와 사용자 이름을 변경할 수 있습니다."
}

Copy link
Member

Choose a reason for hiding this comment

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

필요없는 빈 줄은 삭제합시다!

configUI()
if let userName = userName {
userNameLabel.text = "\(userName)님 Instagram에 \n 오신 것을 환영합니다."
}
Copy link
Member

Choose a reason for hiding this comment

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

if let을 이용한 옵셔널 바인딩 좋습니다👍🏻👍🏻

}

@objc func userNameTextFieldDidChange(_ sender: Any?) {
goToNextButton.isEnabled = true
Copy link
Member

Choose a reason for hiding this comment

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

요기서 textField값 변경을 감지해서 버튼 상태 바꿔주는 것 넘 잘하셨는데요,
만약 사용자가 값을 한번 입력했다가 입력값을 모두 지운다면 다시 버튼의 상태가 비활성화 상태로 바뀌어야하는데
그 부분에 대한 처리가 없는 것 같아요!
setUpNextBtnStatus()와 같은 함수명으로(더 좋은 네이밍이 있다면 바꾸셔도 좋습니다!)
다음 버튼 활성화 조건에 대한 코드를 작성해준 후 여기 userNameTextFieldDidChange()에서 호출해주는 방식으로 리팩토링해봐도 좋을 것 같습니다😊

Copy link
Member Author

Choose a reason for hiding this comment

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

이 부분도 바로 리팩토링 해보겠습니당 ...🥳❤️‍🔥👍🏻🔥

}

@objc func passwordTextFieldDidChange(_ sender: Any?) {
nextButton.isEnabled = true
Copy link
Member

Choose a reason for hiding this comment

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

요기도 위에서 언급한 방식으로 버튼 활성화 조건 똑같이 만들어서 적용해보면 좋을 것 같아요!

super.viewDidLoad()
configUI()
self.passwordTextField.addTarget(self, action: #selector(self.passwordTextFieldDidChange(_:)), for: .editingChanged)
}
Copy link
Member

Choose a reason for hiding this comment

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

요기 들여쓰기가 이상한 것 같은데 원하는 부분 드래그해서 control + i눌러서 라인 맞춰주면 좋을 것 같아요!

@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var clearButton: UIImageView!
@IBOutlet weak var passwordHiddenButton: UIButton!

Copy link
Member

Choose a reason for hiding this comment

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

요거는 별건 아닌데 완료화면에서 다시 로그인 화면으로 돌아왔을 때 값들이 남아있지 않도록 초기화시켜준다면 조금 더 좋은 뷰가 될 것 같아서 도움될만한 코드 남기고 갈게요 참고만 해주세요!

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        resetTextField()
    }

    /// textField 초기화하는 메서드
    private func resetTextField() {
        emailTextField.text?.removeAll()
        passwordTextField.text?.removeAll()
    }

위와 같이 텍스트필드를 초기화시키는 함수를 만들어주고, 요 함수를 viewWillAppear()라는 생명주기 함수에서 호출해주면 됩니다!
viewWillAppear()는 언제 호출되는지 생명주기 함수에 대해 더 찾아보면 도움이 될 것 같구요, 이해가 안가는 부분이 있다면 다시 물어봐줘도 됩니다😊😊

Copy link
Member Author

Choose a reason for hiding this comment

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

별게 아니라뇨,,이런 섬세함ㅜㅜ 생명주기 공부하고 바로 수정해두겠습니다 은주선배 최고 ..🥺❤️‍🔥

Copy link
Member

Choose a reason for hiding this comment

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

@513sojin
https://zeddios.tistory.com/43
요기 잘 정리되어있는 것 같아서 참고해보면 좋을 것 같아요🥰

Copy link
Member

Choose a reason for hiding this comment

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

헐랭 저도 이 부분 놓쳤는데 하나 더 배워갑니다!! 멋진 코드를 위한 따수운 슨배님들..😚

guard let setEmailTextField = !isEmailTextFieldEmpty else {
clearButton.isHidden = false
}
*/
Copy link
Member

Choose a reason for hiding this comment

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

그리구 요부분 textField관련해서 고민의 흔적이 보이는데,,
제가 주현이 PR에서도 요거에 대해 수연선배랑 같이 고민하고 여러 방법들에 대해 논의한 부분이 있어서 링크남길게요!
참고해보면 좋을 것 같습니당😊😊
30th-THE-SOPT-iOS-Part/ByunJuHyeon#2

Copy link
Member Author

Choose a reason for hiding this comment

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

@jane1choi 하 ,,은주선배 저 눔물나요 ㅠㅠ 최고최고,,🍎❤️

Copy link
Member

Choose a reason for hiding this comment

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

왕 다들 TextField 감지하는 버튼을 다양한 방법으로 만들었네요!! 소진님의 코드도 짱짱 깔끔하고 멋져요~!! 저도 제 코드 다듬으러..👩🏻‍💻

@jeongkite jeongkite self-requested a review April 11, 2022 03:57
@Jihyun247 Jihyun247 self-requested a review April 11, 2022 04:46
@@ -17,6 +17,7 @@ class LoginViewController: UIViewController {
@IBOutlet weak var goToSignup: UIButton!
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var clearButton: UIImageView!
@IBOutlet weak var passwordHiddenButton: UIButton!

Choose a reason for hiding this comment

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

이 부분은 참고했으면 좋겠어서 추가적으로 남깁니다 !
텍스트필드 위에 버튼을 위에 올려 배치시키는 방법도 있지만, 이렇게 하는 경우 텍스트필드에 텍스트를 오른쪽까지 꽉 차게 입력하게 되면 텍스트와 버튼이 겹치는 상황이 발생하겠죠?

텍스트와 버튼이 겹치지 않도록 하고싶다면 textfield의 rightView를 활용하는 방법이 있어요 !
참고 링크 남길게요

textfield의 rightView : https://developer.apple.com/documentation/uikit/uitextfield/1619596-rightview
기본 클리어버튼 한줄 구현 방법 & rightView를 활용한 custom 클리어버튼 : https://woongsios.tistory.com/315

Copy link
Member Author

Choose a reason for hiding this comment

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

@Jihyun247 좋은 자료 넘넘 감사해요!!! 쇽샥..하러 가보겠습니다 💪🏻

Copy link
Member

@jeongkite jeongkite left a comment

Choose a reason for hiding this comment

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

많은걸 배워가는 멋진 코드.. 후후 짱이구만요~!

guard let setEmailTextField = !isEmailTextFieldEmpty else {
clearButton.isHidden = false
}
*/
Copy link
Member

Choose a reason for hiding this comment

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

왕 다들 TextField 감지하는 버튼을 다양한 방법으로 만들었네요!! 소진님의 코드도 짱짱 깔끔하고 멋져요~!! 저도 제 코드 다듬으러..👩🏻‍💻

@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var clearButton: UIImageView!
@IBOutlet weak var passwordHiddenButton: UIButton!

Copy link
Member

Choose a reason for hiding this comment

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

헐랭 저도 이 부분 놓쳤는데 하나 더 배워갑니다!! 멋진 코드를 위한 따수운 슨배님들..😚

}

@IBAction func loginButtonClicked(_ sender: Any) {
//TODO : sender에는 어떤 것이 들어가는지 공부하기 / 함수명은 어떤식으로 정하는지
Copy link
Member

Choose a reason for hiding this comment

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

왕 이렇게 TODO 남기는거 너무 좋은 것 같아요!! Mark 말고 요것도 같이 활용해야겠네요!!

@513sojin 513sojin merged commit de11fca into 30th-THE-SOPT-iOS-Part:main Apr 14, 2022
513sojin added a commit that referenced this pull request May 1, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEAT] iOS 1차 과제
5 participants