개발
-
확장 축소 가능한 동적 높이 TableView 구현 하기개발/Swift 2023. 4. 16. 13:46
Modern Collection View 와 MVVM 패턴 가이드 [iOS] Modern Collection View & MVVM 패턴 가이드 - 인프런 | 강의 MVVM 패턴과 Modern Collection View를 사용해 네트워킹을 구현하고, 다양하고 동적인 Collection View를 자유자재로 다룰 수 있게 됩니다., - 강의 소개 | 인프런 www.inflearn.com 동적 높이 셀 동적 높이 테이블뷰 확장 축소 가능 테이블뷰 Table view높이 구하기 테이블뷰의 높이가 컨텐츠에따라 유동적으로 설정이 되려면 높이를 지정해주지 않고 제약조건을 잘 설정 해주면 된다. titleLabel.snp.makeConstraints { make in make.top.equalTo(9) make.le..
-
Relay를 사용하면 무조건 메인스레드 일까개발/Swift 2023. 4. 2. 15:03
Relay나 Driver를 사용하면 에러나 complete이 없기때문에 UI 작업에 적합하다 알고있었기에 아무 거리낌없이 사용중이었다. var error: PublishRelay { get } 뷰 모델에서 에러가 발생하는경우 위 Relay에 에러를 accept 해서 뷰컨트롤러에 전달한다. 뷰컨트롤러는 해당 error 를 바인딩 하고 있다가 에러가 떨어지면 모달을 띄우는 역할을 하고있다. 네트워킹의 경우 background 스레드를 사용하고있다. 네트워킹에서 에러가 발생하는 경우 //Background Thread self.error.accept(error) 에러를 방출 시켜주었다. 이때 뷰컨트롤러에서 crash가 발생했다. modal을 띄우는것은 메인스레드를 쓰라는 것이다. viewModel.error ..
-
Rxswift 네트워크 에러 핸들링개발/Swift 2023. 4. 2. 15:00
public func checkSignUpID(loginID: String) -> Observable 위 함수는 네트워킹을 통해 Bool 타입을 Obseravle로 감싸 리턴해준다. 해당 타입은 true, false ,error 를 Obervable에 감싸 리턴한다. 요구 조건은 다음과 같다. 에러가 발생해도 VC의 구독이 끊기면 안된다. false와 error 모두 다른 핸들링이 필요하다. 일반적으로 사용하면 checkSignUpID() 에서 에러 발생시 구독이 끊긴다. 그러면 다시 요청했을때 아무런 이벤트가 발생 하지 않는다 구독이 끊기지 않게 하기 위해서 catch를 사용해 다시 Observable을 리턴해줘여한다. let subscribe = validSignUpID(loginID: loginID..
-
Rx + TableView(CollectionView) 바인딩 안되는 오류 해결방법개발/Swift 2023. 3. 21. 18:25
1. TableView에서 발생 (제약조건) dataSubject.bind(to: tableView.rx.items) { tableView, row, element in print("Test") return UITableViewCell() }.disposed(by: disposeBag) dataSubjecgt에 값을 아무리 집어 넣어도 위의 셀을 리턴하는 클로저가 호출이 계속안됨 tableView.register(IDIntergrationAuthCell.self, forCellReuseIdentifier: IDIntergrationAuthCell.id) tableView.rx.setDelegate(self).disposed(by: disposeBag) 레지스터와 delegate 모두 빠지지 않은 상태 (..
-
[Swift] 직접 UITableView를 구현하기개발/Swift 2023. 1. 12. 17:04
스크롤 구현 방식 스크롤을 구현하기 위해 UIstackView를 통해 UI들을 집어넣고 UIPanGesture를 통해 터치이벤트를 받아 스크롤을 구현 했습니다. for i in 1.. UIImageView? { guard let image = UIImage(named: "image\\(index)") else {return nil} let imageView = UIImageView(image: image) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.heightAnchor.constraint(equalToConstant: cellHeight).isActive = true return imageView } init에서 초기 1..
-
[Swift] 다양한 데이터 타입 동적으로 Decoding 하기개발/Swift 2023. 1. 9. 17:55
위 데이터 처럼 하나의 리스트에 다른 타입의 데이터를 받아오는 경우가 있다. 이때 해당 데이터를 디코딩할때 문제를 겪게된다. 해결 할수 있는 방법은 위와 같이 모든 프로퍼티들을 옵셔널하게 주는 방법이 있다. 그러면 디코딩 한 결과는 옵셔널 하며 데이터 혹은 nil 이 들어갈것이다. 이런 경우 문제점은 프로퍼티가 모두 옵셔널 하기 때문에 언래핑을 꼭 해줘야 한다는것이다. 더 좋은 방식은 해당 타입을 나누어 다른 타입으로 구현해내는 것이다. 어느 방식으로든 분기를 태워서 A타입, B타입으로 나누어 필요한 프로퍼티만 설정해주는것이다. enum CellItem: Decodable , Hashable{ case company(Company) case horizontal(Horizontal) case none en..
-
외부 영역 터치시 키보드 사라지게 하는방법 in TableView개발/Swift 2022. 12. 5. 14:22
키보드를 입력중에 다른 영역을 터치하면 키보드가 사라지기를 원할수 있다. 이때 가장 쉬운 방법으로 이렇게 구현한다 //VC private func setDismissKeyboardEvent() { let gesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) self.view.addGestureRecognizer(gesture) } @objc private func dismissKeyboard() { self.view.endEditing(true) } Viewcontroller의 뷰에 제스처를 부여해서 endEditing을 호출하면 키보드가 알아서 껒여준다. 그런데 여기서 문제점이 있다. 만약 view 안에 테이..
-
Compositional Layout + Diffable DataSource - 2 헤더 추가하기개발/Swift 2022. 11. 27. 15:35
헤더 추가하기 우선 새로운 타입 sqaure carousel 섹션을 추가했다. 여기서는 새로운 타입의 아이템을 넣어줬다. enum Item: Hashable { case banner(HomeItem) case normalCarousel(HomeItem) case squareCarousel(RestaurantItem) } struct RestaurantItem: Hashable { let name: String let reviewPoint: Float let reviewCount: Int let imageUrl: String } 이러면 데이터소스에 넣어줄때 RestaurantItem 타입을 넣어주고 cell 그릴때 RestaurantItem 타입의 데이터를 받아 사용할수 있다. //스냅샷 부분 snapsh..