self?.dataSource.sectionIdentifier(for: sectionIndex) 위 코드로 섹션을 구분하여 레이아웃을 지정할 수 있다는 것을 알게되었습니다. 내부 동작으로 어떻게 섹션이 구분되는지 궁금합니다. 일반적으로 컬렉션 뷰를 구현할 때는 override func numberOfSections(in collectionView: UICollectionView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } 위 코드의 섹션 카운트 수에 따라 섹션을 구분하는 것으로 알고 있습니다. ex) return이 3이면 0, 1, 2 하지만 강의에서는 위 코드를 사용하지 않았으니 그러면 sectionIndex의 값을 어디서 가져오나요?
안녕하세요. 애구마님 현재 강의는 구매했고 먼저 하던 공부를 끝낸 후 보려고 준비중인데 현재 이 강의를 공부하면서 클론 코딩을 할때 저의 깃허브에 공개용으로 코드나 강의에서 중요한 설명을 코드에 주석처리해서 업로드해도 괜찮을까요? 출처는 Readme로 남기려고 합니다. 깃허브는 이력서 제출시 포트폴리오와 함께 사용하고 있습니다. 감사합니다.
안녕하세요. 강의 잘 듣고 있습니다. 첫번째 질문. 다름이 아니라, 처음에 회원가입 기능을 구현할 때, ViewModel 을 @Observable 을 통해 관찰 가능한 상태로 두고, ViewModel 을 다루는 가장 상위 View인 ContentView 에서 @State 로 선언하는 것까지는 이해가 됩니다. ContentView의 하위 뷰들 중에서, 로그인과 관련한 뷰는 Login - EnterEmail - EnterPassword - EnterName - EnterUserName - Complete인데, 강사님께서 코드로 작성해주신 간접적으로 접근하는 방법 말고, @Environment(SignupViewModel.self) var signupViewModel var body: some View { @Bindable var signupViewModel = signupViewModel 처음 설명해주신 직접적인 접근 방식을 활용했습니다. @Bindable var signupViewModel: SignupViewModel var body: some View{ 와 같이, ViewModel 에 read-write가 가능하기 위해 @Bindable 을 사용한다는 사실은 알고 있습니다. 하지만 문제는 아래와 같이 입력한 결과에 대해서 출력도 잘 하는데, @Bindable 을 적용하였을 때, 마지막 CompleteView 에서 아래의 완료 버튼을 눌렀을 때 MainTabView 으로 넘어가지 않은 문제가 생겼습니다. 기존 Auth.auth().currentUser 을 사용했을 때, swiftUI에서 변화를 감지 못하기 때문에, 알려주신대로 ViewModel 내부에서 var currentUserSession: FirebaseAuth.User? 프로퍼티를 만들어 했는데.. 왜 이러한 문제점이 생기는걸까요? if signupViewModel.currentUserSession != nil{ MainTabView() } else { LoginView() .environment(signupViewModel) } 물론, 강사님이 알려주신 방법대로 하면 잘 넘어갑니다 ^^. 두 번째 질문 간접적인 방법 .environment 를 사용했을 때, 오류가 떠서 CANVAS를 끄고 작업을 하셨는데 오류를 없앨수 있는 방법이 있을까요? 1) 최상단 InstagramCloneApp에 ViewModel을 적용? 2) environment로 설정되는 모든 뷰의 #Preview에 .enivronment() 적용? 긴 글 읽어주셔서 감사합니다 😃 답변 기다리겠습니다.
"ProfileView(viewModel: ProfileViewModel(user: user))" ProfileView에는 init함수가 존재하지 않지만 viewModel을 인자로 받아서 생성자를 호출할 수 있는 이유가 무엇인지 궁금합니다. viewModel에 @state를 사용했기 때문일까요? "구조체에 @state변수가 있다면 해당 구조체를 새로 만들 때 인자로 부여할 수 있다." 이렇게 이해하면 될까요?? @state에 대해 설명부탁드립니다
NewPostViewModel.swift 파일에서 @Observable에 Unknown attribute 'Observable' 이런 오류가 발생합니다... 찾아보니 ios버전이 17이하버전에서는 Observable을 사용할 수 없다고하는데, 제가 지금 16.4버전을 사용중에 있습니다. 버전을 업그레이드하려는데, 이 부분도 해결이 되지 않아서 그러는데, 어떻게 해야할까요?
createListCarouselSection() 함수에서 사용되는 let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitem: item, count: 3) 'vertical(layoutSize:subitem:count:)' was deprecated in iOS 16.0 와 같은 경고가 뜨는데, let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, repeatingSubitem: item, count: 3) 으로 바꿔서 빌드하면 빌드는 되지만, 정상적으로 3개가 표시되지 않는 이슈가 있습니다. NSCollectionLayoutGroup.vertical(layoutSize: groupSize, repeatingSubitem: item, count: 3)을 사용해서 정상적으로 표기되려면 어떻게 해야하나요?
안녕하세요. 선생님 강의를 듣고 MVVM 패턴에 DI 를 적용 해 보다가 질문이 있어 글 남깁니다. 저는 Riverpod Provider 를 적용 해 보려고 하는데요. 선생님께서 사용 하시는 ChangeNotifierProvider 에 DI 를 go_router 에 설정 하셨는데요. 만일 RiverPod Provider 를 사용 한다면 어떻게 적용 해야 할까요? ViewModel안에서 UseCase를 생성자에서 받고 있어서 결국 라우터 안에 주입을 해 줘야 할꺼 같은데 RiverPod 프로바이더에서는 어떻게 해 줘야 할지 모르겠네요.ㅡ,.ㅡ 가이드 좀 부탁드립니다.
안녕하세요. 강의 잘 보고 있습니다. remote data source impl 관련해서 질문이 있습니다. @prod @Singleton(as: CommunityRemoteDataSource) class CommunityRemoteDataSourceApiImpl implements CommunityRemoteDataSource { final _dio = Session().dio; @override Future<CommunityResponseDTO> fetchCommunities() async { Response<dynamic> response = await _dio.get('get/community/path'); final responseDto = CommunityResponseDTO.fromJson(response.data); return responseDto; } } CommunityRemoteDataSource 의 구현체 CommunityRemoteDataSourceApiImpl 를 만들어서 사용중입니다. ApiImpl 은 실제 서버와 통신중 이며, http 라이브러리 Dio를 사용하고 있습니다. 여기서 테스트를 위해 DioMock 객체를 만들어서 사용하고자 합니다. 원래 CommunityRemoteDataSourceApiImpl 에 final _dio = Session().dio; 로 싱글턴으로 dio를 내부에 객체를 생성하고 있는데 이거를 주입받는 식으로 변경하여 테스트 시만 CommunityRemoteDataSourceApiImpl(DioMock()) 을 넣는 것인지, 아니면 CommunityRemoteDataSourceApiMockImpl 를 새로 또 만드는지 궁금합니다. 만약 CommunityRemoteDataSourceApiImpl(DioMock()) 로 주입을 받는 식이라면 Response<dynamic> response = await _dio.get('get/community/path'); final responseDto = CommunityResponseDTO.fromJson(response.data); 해당 코드들이 Dio() 일 때, DioMock() 일 때 달라야 할 것 같은데 어떻게 처리하는 것이 맞는지 궁금합니다. 감사합니다.
안녕하세요 :) MVVM 패턴 구현 강의를 들으면서 질문이 생겼습니다. 혹시 아래처럼 button들의 tap이벤트를 바로 바인딩하지 않고 중간에 subject를 트리거로 만들어 따로 연결하는 이유가 있을까요 ?? rx.tap이 ControlEvent라서 ViewModel의 trigger와 바로 바인딩해줘도 괜찮을 것 같다는 생각이 들었습니다. let input = ViewModel.Input(tvTrigger: buttonView.tvButton.rx.tap.asObservable(), movieTrigger: buttonView.movieButton.rx.tap.asObservable())