월 48,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용-8 앱 / 저장속성과 didSet을 사용하는 패턴 (활용 앱66강)
var member: Member? { didSet { guard var member = member else {return} mainImageView.image = member.memberImage memberNameLabel.text = member.name addressLabel.text = member.address } }안녕하세요 앨런님해당 강의에서 didset 부분의 언래핑하는 부분에서guard let 으로 하지 못하는 이유를 알고싶습니다let 이여도 내부의 프로퍼티가 var 라면 읽을 수 있는것이 아닌지요?lazy로 선언되어서 그런것 같은데 문법부분을 제가 잘 모르는것 같습니다이러한 부분은 문법파트중에 어느부분을 봐야 해소가 될까요?
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
GCD 사용시 주의사항 강의 질문있습니다.
weak self 사용해서 코드 동작 시 "글로벌큐에서 출력하기" 가 출력이 안나와야하는데 출력이 됩니다.. 어떤 문제가 있을까요..?이미지 첨부합니다.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
섹션 15 동기와 비동기의 개념 질문있습니다
강의를 듣던 도중 동기 , 비동기, 직렬, 동시 에 개념에 대해서 질문이 생겼습니다.직렬의 경우 그림으로 표현해 주셨던 것처럼다른 하나의 쓰레드에서 task를 순서에 따라 전부 다 처리한다고 이해했는데,제가 이해한 것이 맞다면, 동기 방식으로 직렬 테스크를 처리했을 때 굳이 다른쓰레드로 테스크를 넘기는 것이 의미가 있나요? 비동기라면 해당 테스크를 직렬로 처리하더라도 동시에 다른 테스크를 진행할 수 있다고 생각하지만 동기처리의 경우 결국 메인쓰레드에서 진행하는 것과 같은 수준의 처리시간이 들고 오히려 쓰레드를 바꾸는데에 대한 리소스만 더 사용하게 되는것은 아닌가요??라는 의문이 들었습니다..!
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용8, 오토레이아웃 설정에서 질문있어요
안녕하세요, 엘런저번에 코드로 넷플릭스 로그인 화면을 구성할 때는UIView에 대한 오토레이아웃 설정을override init(frame: CGRect) { super.init(frame: frame) setup() addViews() setConstraints() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }이렇게 해주었는데이번 강의에서 언급된 updateConstraints() 메서드를 활용하지 않은 이유가 있을까요?? 넷플릭스 로그인 화면의 오토레이아웃 메서드인 setConstraints()만 updateConstraints()에 넣어주면 뷰를 띄우는 순서?에 관련한 오류가 나서요.뷰 자체를 생성하는 것이라 drawing cycle을 제외하고 생각해도 돼서 그런건가?라는 생각이 들어서 질문드립니다.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용-7, 데이터 저장에 대해서 질문있어요.
viewDidLoad에서 let array = movieDataManager.getMovieData()로 데이터를 담았더니 스파이더맨2 추가가 안 되고, 셀을 구성할 때let array = movieDataManager.getMovieData() let movie = array[indexPath.row]cell.mainImageView.image = movie.movieImagecell.movieNameLabel.text = movie.movieNamecell.descriptionLabel.text = movie.movieDescription이렇게 넣어주니까 추가가 되는 것 같은데. . 제가 어디서 놓친건지 아니면 원래 안 되는건지 모르겠어요 ..
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
섹션 7 - 24강
저는 오토레이아웃을 잡을 때 강의를 참고하면서 Snapkit, Then 라이브러리를 적용해 만들고 있는데 Snapkit을 사용할 경우 어떤 방식으로 레이아웃을 변경 해야할까요 ?
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용 - 2) 텍스트필드 / 델리게이트 패턴 개념 질문
안녕하세요 앨런님 델리게이트 패턴 관련해서 궁금한게 있어서 질문 드려봅니다.1.텍스트필드 delegate에 ViewController 인스턴스 등록2.View 인스턴스는 UITextFieldDelegate 프로토콜 채택3.텍스트필드에서 실제 이벤트 발생시 등록된 delegate의 메서드를 호출(아마 호출된 메서드의 반환값을 이용하여 허용 또는 금지를 시킬것같은데 잘은 모르겠습니다.)4.ViewController 클래스에서는 필요한 논리를 작성하거나 Bool 형식으로 값을 리턴하여 텍스트필드를 제어UITextFieldDelegate 프로토콜을 채택하고 사용하면 되기에해당 메서드의 구현부는 공개할 필요가 없음.제가 이해한것이 맞는지 판단이 안서서 질문 남겨봅니다.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용앱 8 강의 질문있습니다.
강의에서는 DetailViewController 에서 새 멤버를 추가하는 로직과 업데이트하는 디테일뷰 로직을 같이 사용했는데,DetailView와 똑같은 AddMemberView를 하나 더 만들어서 로직을 분리하는 것에 대해서는 어떻게 생각하시나요?강의 코드는 효율적이긴하지만 협업을하거나 유지보수를 가정하고 구현했을 때는 조금 복잡할 수도 있다는 생각이 듭니다!어떤것이 더 좋은 코드인것인지에 대한 의견을 듣고싶습니다!물론 정답이라는 것은 없겠지만요!
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용-10앱 질문
안녕하세요 선생님. 좋은 강의 너무 감사드립니다! 강의 보다가 질문이 생겼는데 뷰컨에서 디테일뷰컨으로 넘어갈때 디테일뷰컨에 mainTextView.becomeFirstResponder()를 설정해서 수정화면 가면 바로 키보드가 올라오도록 설정이 되어있는데요, 뷰컨에서 디테일 뷰컨으로 넘어갈때 키보드는 올라오긴하는데 디테일뷰컨으로 넘어가는 순간에 아주 짧은순간? 뷰컨으로 이동됐다가 다시 바로 디테일뷰컨으로 넘어가는 식으로 되는데.. 왜 이런현상이 나타나는지 혹시 짐작가는곳 있으실까요..?? mainTextView.becomeFirstResponder()를 지우면 그냥 정상적으로 스무스하게 뷰컨에서 디테일뷰컨으로 넘어갑니다..
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
기초 앱 13강 - currentTitle! 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의명 : (기초-3) 가위바위보 앱 만들기 / 코드에 대한 자세한 설명 (기초 앱 13강)(현상)1) let select = sender.currentTitle! --> 에러발생Fatal error: Unexpectedly found nil while unwrapping an Optional value2) let select = sender.titleLabel?.text --> 에러없음.그런데, 강사님 다운받은 소스로 실행시, 에러가 발생하지 않습니다. (질문)결국, 코드 문제가 아니라, 옵션 설정 혹은 객체에서 코드로 드래그 연결하는 부분에서 수정/삭제/추가 작업을 하면서 뭔가 유실된게 아닐까 추측하는데, 무엇을 점검해야 될까요? ( 코드는 똑같은 거 전부 점검했습니다. )
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
UIView는 왜 필요한가요?
안녕하세요.현재 "코드로 UI짜기" 강좌를 진행 중입니다.문득 이런 생각이 들어 질문 드립니다. UIView 없이 바로 라벨이랑 텍스트 필드만 사용하면 안되는건가요? UIView의 역활은 어떤 것이 있는지요.검색 능력 부족인지 웹에서는 좋은 답을 찾지 못해 질문드립니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
weightTextField에서 엔터를 눌러도 키보드가 안내려가는 문제(활용앱 37강 07:00)
extension ViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if Int(string) != nil || string == "" { return true }// 글자 입력을 허용 return false // 글자 입력을 허용하지 않음 } func textFieldShouldReturn(_ textField: UITextField) -> Bool { // 두개의 텍스트필드를 모두 종료 (키보드 내려가기) if heightTextField.text != "", weightTextField.text != "" { weightTextField.resignFirstResponder() return true // 두번째 텍스트필드로 넘어가도록 } else if heightTextField.text != "" { weightTextField.becomeFirstResponder() return true } return false } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { heightTextField.resignFirstResponder() weightTextField.resignFirstResponder() } } 위와 같이 입력을 했는데 두 텍스트필드를 입력하고 엔터를 누르면 밑 사진처럼 숫자 입력 키보드에서 한글 입력 키보드로 바뀌기만 할 뿐 키보드가 내려가지 않습니다.. 무엇이 문제일까요??저 상태에서 화면 다른 부분을 터치했을 때 내려가긴 합니다.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
cornerRadius가 적용이 안되는 문제가 있어 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 앨런님현재 코드로 ToDoApp을 만들고 있는데 DetailView 부분을 코딩하면서 색상 버튼 부분에 cornerRadius가 적용이 안되는 문제가 있어 질문드립니다.현재까지 제가 해결을 위해 확인한 부분은 아래와 같습니다.setupSaveButtonConstraints()를 호출 시 red, green, blue, purple 버튼에 cornerRadius 적용되지 않습니다.setupButtonCorner() 함수의 호출 지점을 layoutSubView()의 super 호출 전 또는 후로 설정해 보았지만 적용되지 않았습니다.setupButtonCorner() 함수에서 button에 height를 설정해서 실행해 보았지만 적용되지 않았습니다.이 문제를 해결할 수 있는 방법이 뭐가 있을까요?import UIKit final class DetailView: UIView { // MARK: - Color Buttons let redButton: UIButton = { let button = UIButton() button.setTitle("Red", for: .normal) // button.setTitleColor(MyColor.red.buttonColor, for: .normal) // button.backgroundColor = MyColor.red.backgroudColor button.titleLabel?.font = UIFont.systemFont(ofSize: 15) // button.translatesAutoresizingMaskIntoConstraints = false return button }() let greenButton: UIButton = { let button = UIButton() button.setTitle("Green", for: .normal) // button.setTitleColor(MyColor.green.buttonColor, for: .normal) // button.backgroundColor = MyColor.green.backgroudColor button.titleLabel?.font = UIFont.systemFont(ofSize: 15) // button.translatesAutoresizingMaskIntoConstraints = false return button }() let blueButton: UIButton = { let button = UIButton() button.setTitle("Blue", for: .normal) // button.setTitleColor(MyColor.blue.buttonColor, for: .normal) // button.backgroundColor = MyColor.blue.backgroudColor button.titleLabel?.font = UIFont.systemFont(ofSize: 15) // button.translatesAutoresizingMaskIntoConstraints = false return button }() let purpleButton: UIButton = { let button = UIButton() button.setTitle("Purple", for: .normal) // button.setTitleColor(MyColor.purple.buttonColor, for: .normal) // button.backgroundColor = MyColor.purple.backgroudColor button.titleLabel?.font = UIFont.systemFont(ofSize: 15) // button.translatesAutoresizingMaskIntoConstraints = false return button }() lazy var buttons: [UIButton] = [redButton, greenButton, blueButton, purpleButton] lazy var colorButtonStackView: UIStackView = { let st = UIStackView(arrangedSubviews: [redButton, greenButton, blueButton, purpleButton]) st.axis = .horizontal st.spacing = 15 st.alignment = .fill st.distribution = .fillEqually return st }() // MARK: - Text View let mainTextView: UITextView = { let textView = UITextView() textView.backgroundColor = .clear textView.font = UIFont.systemFont(ofSize: 14) textView.textColor = .black return textView }() lazy var backgroundView: UIView = { let view = UIView() view.addSubview(mainTextView) view.backgroundColor = MyColor.red.backgroudColor return view }() // MARK: - Update Button let saveButton: UIButton = { let button = UIButton() button.titleLabel?.font = UIFont.systemFont(ofSize: 15) button.setTitleColor(.white, for: .normal) button.backgroundColor = MyColor.red.backgroudColor return button }() override init(frame: CGRect) { super.init(frame: frame) setupDetailView() setupButtonColor() setupConstraints() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setupDetailView() { self.backgroundColor = .white self.addSubview(colorButtonStackView) self.addSubview(backgroundView) self.addSubview(saveButton) backgroundView.clipsToBounds = true backgroundView.layer.cornerRadius = 10 saveButton.clipsToBounds = true saveButton.layer.cornerRadius = 8 layoutSubviews() } func setupConstraints() { setupColorButtonSVConstraints() setupBackgroundViewConstraints() setupMainTextViewConstraints() // 왜 이걸 설정하면 색깔 버튼의 cornerRadius가 변경이 안될까요? setupSaveButtonConstraints() // setupButtonCorner() } func setupColorButtonSVConstraints() { print(#function) colorButtonStackView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ colorButtonStackView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 25), colorButtonStackView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -25), colorButtonStackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 20), // colorButtonStackView.bottomAnchor.constraint(equalTo: backgroundView.topAnchor, constant: -40), colorButtonStackView.heightAnchor.constraint(equalToConstant: 35) ]) } func setupBackgroundViewConstraints() { print(#function) backgroundView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ backgroundView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 25), backgroundView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -25), backgroundView.topAnchor.constraint(equalTo: colorButtonStackView.bottomAnchor, constant: 40), // backgroundView.bottomAnchor.constraint(equalTo: saveButton.topAnchor, constant: -40), backgroundView.heightAnchor.constraint(equalToConstant: 200) ]) } func setupMainTextViewConstraints() { print(#function) mainTextView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ mainTextView.leadingAnchor.constraint(equalTo: backgroundView.leadingAnchor, constant: 15), mainTextView.trailingAnchor.constraint(equalTo: backgroundView.trailingAnchor, constant: -15), mainTextView.topAnchor.constraint(equalTo: backgroundView.topAnchor, constant: 8), mainTextView.bottomAnchor.constraint(equalTo: backgroundView.bottomAnchor, constant: -8) ]) } func setupSaveButtonConstraints() { print(#function) saveButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ saveButton.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 25), saveButton.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -25), saveButton.topAnchor.constraint(equalTo: backgroundView.bottomAnchor, constant: 40), saveButton.heightAnchor.constraint(equalToConstant: 40) ]) } func setupButtonColor() { print(#function) buttons.forEach { button in button.setTitleColor(MyColor(rawValue: Int64(buttons.firstIndex(of: button)!) + 1)?.buttonColor, for: .normal) button.backgroundColor = MyColor(rawValue: Int64(buttons.firstIndex(of: button)!) + 1)?.backgroudColor } } override func layoutSubviews() { print(#function) super.layoutSubviews() setupButtonCorner() } func setupButtonCorner() { print(#function) buttons.forEach { button in button.clipsToBounds = true button.layer.cornerRadius = button.bounds.height / 2 } } }
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
UITableViewCell 높이 관련 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.활용 8번 앱을 만들어 보고 있습니다. 활용 8에 MyTableViewCell에 memberNameLabel과 addressLabel이 UIStackView에 추가 되어 있고, 제가 임의로 UIStackView 다른 Label도 넣어보았습니다. 그런데 글자가 짤리더라구요. 아무래도 tableView.rowHeight가 설정되어 있어서 그런 것 같은데, tableView.rowHeight를 고정으로 설정하지 않고 높이를 동적으로 설정하는 방법이 있을까요?검색해서 아래 두 코드도 추가해봤는데 높이가 고정으로 잡히네요 ㅠㅠ 해결 방법이 없을까요? 답변 부탁드립니다. 감사합니다. tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = UITableView.automaticDimensionextension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } }
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
decode함수가 실패해요
let string = String(data: safeData, encoding: .utf8)!safeData를 String으로 파싱하여 string을 print하면 데이터가 잘 출력되는걸 확인할 수 있어요.try JSONDecoder().decode(MusicData.self, from: safeData)하지만 MusicData.self에 파싱하면 실패합니다. print(safeData)의 결과값은 "77185bytes"로 데이터의 크기만 출력해주는데, 어떻게 하면 MusicData에 데이터를 담을 수 있을까요?
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
트랙패드로 작업하기 좋을까요?
xcode를 트랙패드로 작업하기 좋을까요? 강사님은 트랙패드로 작업하시나요, 마우스로 작업하시나요?
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용앱 84강
안녕하세요. 강의 잘 보고있습니다. 좋은 강의 감사합니다.질문이 있는데 Main.storyboard에서 View Controller 안에 TodoCell안에 Content View안에 Background View가 있는데 이것도 플러스 버튼을 눌러서 따로 View를 생성을 하신건가요?? 그럼 플러스 버튼 눌러서 View를 생성하고 그 안에 스택뷰(레이블과 뷰를 묶은)를 넣은 형태인지 여쭤보고 싶습니다.플러스 버튼 눌러서 Background View를 만든것이라면 이름이 왜 Background View로 설정이 되는건가요??답변 부탁드리겠습니다!
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용-1 앱(timer 앱) -> 분과 초로 나타내기
안녕하세요! 양질의 강의를 제공해주셔서 감사합니다.제 질문은총 타이머의 시간을 300초로 늘린 후,타이머의 시간을 나타내는 mainLabel에 60초가 넘어가는 타이머를 설정하였을 때2분, 32초 이렇게 분과 초로 나타내고 싶습니다.제 생각은 let seconds를 초로 나타내고let minute으로 분을 나타내서 mainLabel에만 나타내면 안될까라는 생각과if문을 사용해서 60초와 120초 180초 이렇게 분 단위로 나누어서 앞에 분을 나타나게 만들어볼까 시도했지만 실패했습니다. 너무 포괄적인 질문이라 죄송합니다!!방법이 있다면 가벼운 힌트를 주시면 감사하겠습니다.
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
함수 인자에 numberOfRowsInSection은 무엇인가요?
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return moviesArray.count }section의 자료형이 Int인건 알겠는데 앞에 붙어있는 numberOfRowsInSection이 무엇인지 잘 모르겠네요. swift의 어떤 문법인지 알려주시면 좋겠습니다!
- 미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
스토리보드로 짠 ui의 클래스의 생성자를 만들 수 없나요?
class SecondViewController: UIViewController { @IBOutlet weak var mainLabel: UILabel! var someString: String? override func viewDidLoad() { mainLabel.text = someString super.viewDidLoad() } init(someString: String? = nil) { self.someString = someString super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init?(coder) error") } @IBAction func backButtonTapped(_ sender: UIButton) { self.dismiss(animated: true) } }스토리보드로 만든 클래스의 생성자를 만들고 storyboard?.instantiateViewController(widthIdentifier: "secondVC")를 호출하면 init?(coder: NSCoder)가 호출되어 에러가 발생하네요.위 코드처럼 생성자를 만드는 방법은 없을까요?