-
Notifications
You must be signed in to change notification settings - Fork 1
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
Conversation
There was a problem hiding this 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() |
There was a problem hiding this comment.
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) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forEach
로 한번에 처리 너무 잘했는데!
viewDidLoad()
와 같은 생명 주기 함수 안에는 함수 호출 구문만 써주는 것이 좋습니다!(코드의 가독성을 위해)
그래서 협업 시 대부분 기본 컨벤션으로 가져가는 것 같아요! 요 부분은 함수로 따로 빼서 호출하는 식으로 바꿔봅시다!
There was a problem hiding this comment.
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의 크기를 지정해주고 싶다 ! |
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요부분도 함수로 따로 빼봅시다~!
func configUI(){ | ||
welcomeText.text = "언제든지 연락처 정보와 사용자 이름을 변경할 수 있습니다." | ||
} | ||
|
There was a problem hiding this comment.
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 오신 것을 환영합니다." | ||
} |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요기서 textField
값 변경을 감지해서 버튼 상태 바꿔주는 것 넘 잘하셨는데요,
만약 사용자가 값을 한번 입력했다가 입력값을 모두 지운다면 다시 버튼의 상태가 비활성화 상태로 바뀌어야하는데
그 부분에 대한 처리가 없는 것 같아요!
setUpNextBtnStatus()
와 같은 함수명으로(더 좋은 네이밍이 있다면 바꾸셔도 좋습니다!)
다음 버튼 활성화 조건에 대한 코드를 작성해준 후 여기 userNameTextFieldDidChange()
에서 호출해주는 방식으로 리팩토링해봐도 좋을 것 같습니다😊
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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) | ||
} |
There was a problem hiding this comment.
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! | ||
|
There was a problem hiding this comment.
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()
는 언제 호출되는지 생명주기 함수에 대해 더 찾아보면 도움이 될 것 같구요, 이해가 안가는 부분이 있다면 다시 물어봐줘도 됩니다😊😊
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
별게 아니라뇨,,이런 섬세함ㅜㅜ 생명주기 공부하고 바로 수정해두겠습니다 은주선배 최고 ..🥺❤️🔥
There was a problem hiding this comment.
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
요기 잘 정리되어있는 것 같아서 참고해보면 좋을 것 같아요🥰
There was a problem hiding this 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 | ||
} | ||
*/ |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jane1choi 하 ,,은주선배 저 눔물나요 ㅠㅠ 최고최고,,🍎❤️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
왕 다들 TextField 감지하는 버튼을 다양한 방법으로 만들었네요!! 소진님의 코드도 짱짱 깔끔하고 멋져요~!! 저도 제 코드 다듬으러..👩🏻💻
@@ -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! |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Jihyun247 좋은 자료 넘넘 감사해요!!! 쇽샥..하러 가보겠습니다 💪🏻
There was a problem hiding this 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 | ||
} | ||
*/ |
There was a problem hiding this comment.
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! | ||
|
There was a problem hiding this comment.
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에는 어떤 것이 들어가는지 공부하기 / 함수명은 어떤식으로 정하는지 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
왕 이렇게 TODO 남기는거 너무 좋은 것 같아요!! Mark 말고 요것도 같이 활용해야겠네요!!
🌱 작업한 내용
기본 과제
도전 과제
심화 과제
🌱 PR Point
(바로 연결되어 있지않은 VC간 데이터를 전달할 때는 보통 어떤 방식을 많이 활용하는지 궁금해요)
📸 스크린샷
📮 관련 이슈