묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨아키텍처 패턴 with iOS - GUI Architecture Patterns(이론)
제가 이해한게 맞는지 궁금합니다.
솔직히,, MVC나 MVP나 MVVM이나 머가 그렇게 다른지 잘 이해가 안가긴합니다..모델과 뷰를 분리하고 이를 컨트롤하는 영역을 어떻게 처리하면 좋을까 하는데서 조금씩 차이가 있어서 구분하려는게 목적인 걸까요. 뷰모델이라 한다해도 처리해야할 복잡성이 올라가면 결국 복잡해지는 건 똑같아 보입니다.. 그럼에도 불구하고 UIKit을 사용할 때 NVVM을 쓸라고 하는건 테스트가 용이하다는 이유랑, 그냥 옵저버 패턴 쓰고 싶어서인 것 같습니다. Combine이 나온 것도 뭔가 너네가 옵저버 방식 좋아하는 것 같으니까 만들었어 같은 느낌인 것 같고,, SwiftUI를 공부하면서 보니까 자연스럽게 Combine 쓰게되고 쓰다보니 자연스레 아래처럼 구조가 분리되는 것 같은데 이게 NVVM이 맞는 걸까요?뷰(들어오는 데이터 대로 그려지는 뷰 구조체 모음)모델(타입 or 인터페이스 모음)로직(뷰의 로직 처리 함수모음)스토어(상태 데이터모음)
-
미해결앨런 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() } } 위와 같이 입력을 했는데 두 텍스트필드를 입력하고 엔터를 누르면 밑 사진처럼 숫자 입력 키보드에서 한글 입력 키보드로 바뀌기만 할 뿐 키보드가 내려가지 않습니다.. 무엇이 문제일까요??저 상태에서 화면 다른 부분을 터치했을 때 내려가긴 합니다.
-
미해결
Closure 실전 세번째 설명 질문입니다.
강의을 수강하면서 아래의 함수를 사용하려고 하는데 if name.contains 구문에서아래와 같은 오류가 발생됩니다.let names = ["apple", "air", "brown", "red", "orange", "blue", "candy"] func someFind(find: String) -> [String] { var newNames = [String]() for name in names { if name.contains(find) { newNames.append(name) } } return newNames } Cannot convert value of type 'String' to expected argument type 'String.Element' (aka 'Character')강의에서는 잘 되는데, 제가 선언해서 저 함수를 쓰려고할때 발생되는 에러 메세지인데..String에서는 Charater Type밖에 찾을 수 없다고 합니다. 왜 강사님 코드는 되고 저는 안되는것인가요..?문자열 배열에서 검색한번 해보려고 하는데 오류가 발생되는데... 왜 이런 오류가 발생되는것인가요. ㅠㅠ
-
미해결Flutter 초입문 왕초보편
에뮬레이터 실행
왜 에러가 발생하죠? 코드분석하려고 실습파일을 가져와서 불러왔는데 에뮬레이터실행이 안됩니다
-
미해결Flutter 초입문 왕초보편
라이브템플릿
왼쪽이 제 안드로이드스튜디오이고요, 오른쪽이 강의인데강의에는 Flutter내에 있는 목록이 다르게 나와요 원래 그런가요?
-
해결됨[Lv.1] 누구나 할 수 있는 - SwiftUI Basic with iOS 17
안녕하세요 Jacob님!
안녕하세요! 이번에 새로 강의를 듣게 된 학생입니다.강의 정말 잘 듣고 있으며 정리글에 대해 질문을 드리고자합니다.저는 평소에 무료강의를 들을때 깃허브에 마크다운으로 정리하곤 합니다.이번 강의도 정리를 하고싶은데 강의노트 포함, 자료실에서 받은 코드 파일은 당연히 올리지 않지만, 출처를 밝히며 제가 따라친 코드와 결과물 정도를 마크다운에 작성해 올려도되는지 여쭙고싶습니다!
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
클론강의 tableViewCell
8:17 에 데이터모델을 받는 변수를 왜 굳이 함수로 만드는 이유를 자세히 알려주세요20:10 에 왜 movieModel처음에 nil에 할당 되어 있다가 바로 movieMoel 데이터가 안담겨지나요 ? 비동기적으로 처리한 데이터를 movieModel에 넣었을때, collectionView를 reloadData를 한 이유를 컨트롤러 생성 과정을 통해 자세히 알려주세요
-
미해결개발하는 정대리 스위프트 기초 문법
클로저 사용 방법의 다양성
클로저를 사용하는 다양한 방법에 대해서 공부할 수 있었습니다.그렇다면 Swift는 왜 이렇게 같은 결과 같에 대해서 다양한 표현 방식을 가지고 있는 건가요?또 실제 코딩시 상황마다 적절한 형태가 존재 하는건가요?
-
미해결Flutter 초입문 왕초보편
main_screen 질문
051.비만도계산기프로젝트 강의영상 2:58에서요 class MainScreen extends StatefulWidget { const MainScreen({Key? key}) : super(key: key); @override State<MainScreen> createState() => _MainScreenState(); } class _MainScreenState extends State<MainScreen> { @override Widget build(BuildContext context) { return Container(); } } 이렇게 입력을 한 이유가 뭔가요? MainScreen 하고 Container이요
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
Location.pin강의에서 self질문이요
안녕하세요 강의내용중에 질문있어서 글올립니다.PinLandMark라는 열거형에서 var title: String { return "\(self)" // self는 case를 가르킴 }이부분에 해당하는 self가 열거형의 case를 나타낸다고 이해했는데 왜 그렇게 되나요?밑의코드인 var coordinate:CLLocationCoordinate2D { switch self { case .Deoksugung: return .init(latitude: <#T##CLLocationDegrees#>, longitude: <#T##CLLocationDegrees#>) case .Hyeongbokgung: return .init(latitude: <#T##CLLocationDegrees#>, longitude: <#T##CLLocationDegrees#>) case .SeoulCityHall: return .init(latitude: <#T##CLLocationDegrees#>, longitude: <#T##CLLocationDegrees#>) } }의경우 switch self가 PinLandmark를 가르키지않나요?제가 이해한건 self라는건 class,struct,열거형의 인스턴스를 가르킨다고알고있는데 제가 잘못이해한건가요?
-
미해결배달앱 클론코딩 [with React Native]
AppStore 언어 정보에 여러 언어 표시하는 방법
안녕하세요 제로초님.앱을 개발하고 배포까지 하였습니다.앱스토어에서 '한국어 및 영어'로 표시하고 싶은데 지금은 '한국어'만 표시되네요.언어정보에 어떻게 여러 언어를 표시할 수 있나요?예시는 배달의 민족이고 Xcode 에서는 다음과 같이 설정하였습니다.
-
미해결Flutter 초입문 왕초보편
문법 난이도
다트 문법이 어려운데 어떻게해야하나요?저자 책에 다트문법이 잘 설명되있나여?
-
해결됨Flutter 초입문 왕초보편
코드 예제소스
중간에 따라하다가 실수로 뭐가 잘못된건지 따라한 작성내용이 다날라가서혹시 코드소스 있으면 올려주실수있나요?
-
해결됨Flutter 초입문 왕초보편
이미지 에셋 에러
이거 sfac.png파일이 깨지는데 어떻게 하죠?The following assertion was thrown resolving an image codec:Unable to load asset: assets/sfac.png. 라고 뜹니다
-
미해결Flutter 초입문 왕초보편
웹뷰 폰트고정은 어떻게 하나요?
웹뷰에 뜨는 페이지의 폰트가폰의 시스템폰트 따라서 크기가 달라지는데고정을 할 수는 없나요?https://geojun.tistory.com/m/59이거 따라해봤는데 안되서 여쭤봅니다.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
넷플릭스 table cell 관련해서 질문이 있습니다.
안녕하세요. 넷플릭스 프로젝트를 따라하면서 제가 수강하면서 뭔가를 놓친건지 막혔었다가 해결한 부분이 있습니다. 테이블 섹션마다 영화, 팟캐스트 등의 이미지를 보여주는 콜렉션뷰의 높이는 UICollectionViewDelegateFlowLayout로 sizeForItemAt 메소드로 설정해줬는데 테이블뷰의 row 높이를 설정해주지 않아서 콜렉션 셀의 높이와 너비를 지정했음에도 사진처럼 적용되지 않는 현상이 있었습니다.해결은 테이블뷰 델리게이트로 heightForRowAt으로 높이값을 콜렉션 셀의 높이값보다 크게 지정해줘서 해결은 됐습니다. 해결은 했는데 강의를 수강하면서 테이블뷰 row의 높이값을 설정하는 부분을 못본 것 같은데 제가 뭔가 놓친건지 질문드립니다.P.S. 좋은 강의 감사합니다 🙏
-
미해결앨런 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 개발자 되기 [기초부터 실무까지]
Capturing Valus
cloule 3번째 강의에서 // Capturing Valus// reference Type(class, function, closure)// value Type(Int, String, Array, Dictionary, struct)라고 알려주셨는데 String은 reference type가아닌가요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
안녕하세요 todolist강의중에서 UI구성중 xib파일 오토레이아웃질문입니다.
안녕하세요 xib파일에서 오토레이아웃 설정중에 오류가 나와서 질문드려요위와같이 xib파일에서 테이블셀에 오토레이아웃을 적용했는데 시뮬레이터에서는 오토레이아웃이 적용이안되고있습니다. xocde껐다 실행하기와 컴퓨터를 껐다켰는데도 이러는데 혹시 왜이러는건지 질문드려도될까요?
-
미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.
안녕하세요.강의 잘 듣고 있습니다!sync를 공부하다가 의문이 생겨서 질문 남깁니다.메인스레드에서 메인큐로 sync로 작업을 보내면ui를 보여줘야할 메인에서 작업을 한없이 기다리게 되니 크래시가 난다고 알고 있습니다.강의에서, 메인에서 글로벌큐로 sync로 작업을 보내더라도 실질적으로는 메인에서 작업을 한다고 하셨는데요.그렇다면 실질적으로는 메인에서 sync로 작업을 하는 것과 다를 바가 없는데, 그런 경우에는 왜 크래시가 발생하지 않는 건가요?