idghst.dev
article thumbnail
[ iOS ] MVVM - 실습
iOS 2023. 3. 22. 09:00

...ViewModel.swift viewModel 에서는 input 과 output 을 작성합니다 input 에서는 User Action 등 입력 데이터를 output 에서는 처리한 Data 로 결과 데이터를 화면에 뿌려줍니다 init() 초기화 함수에서는 viewModel 에서 동작할 변수를 초기화하는 기능을 수행합니다 import Foundation import Combine final class FrameworkListViewModel { init(items: [AppleFramework], selectedItem: AppleFramework? = nil) { self.items = CurrentValueSubject(items) self.selectedItem = CurrentValueSubje..

article thumbnail
[ iOS ] MVVM - 개념
iOS 2023. 3. 20. 09:00

왜 MVVM이 생겼나? 기존 MVC 패턴의 문제 View 와 View Controller 는 View 와 Controller 레이어로 나누어 설명하지만 실제로 구현 시, 거의 분리되지 않습니다 따라서, 위 그림과 같이 표현되는게 좀 더 현실모습을 잘 담고 있습니다 이러다 보니, View Controller 에 많은 로직들이 존재하게 됩니다 프레젠테이션 로직 비즈니스 로직 데이터 접근 로직 등등.. 결국에 Massive ViewController 라는 불명예 스러운 용어가 붙었습니다 위와 같은 이슈로 발생하는 문제 View Controller 가 너무 많은 책임을 지고 있음 모델(데이터)를 직접 접근하면서 수정하다보니, 버그에 취약하게 됨 유지보수가 어려움 (변경과 수정에 어려움이 많아짐) 기존 문제들의 ..

article thumbnail
[ iOS ] Navigation
iOS 2023. 2. 27. 09:00

내비게이션 컨트롤 화면 이동 let storyboard = UIStoryboard(name: "QuickFocus", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "QuickFocusListViewController") as! QuickFocusListViewController // title 전달 viewController.title = item.title // fullscreen 으로 내비게이션 화면 이동 (뒤로가기 가능) navigationController?.pushViewController(viewController, animated: true) 여러 개의 Section 으로 나눠서 출..

article thumbnail
[ iOS ] Modal
iOS 2023. 2. 24. 09:00

모달 모달을 여는 코드입니다. let storyboard = UIStoryboard(name: "Detail", bundle: nil) // Storyboard ID 로 스토리보드를 찾는다 let viewController = storyboard.instantiateViewController(withIdentifier: "AppleFrameworkDetailViewController") as! AppleFrameworkDetailViewController // framework 데이터를 전달한다 viewController.framework = framework // 모달 스타일을 automatic 이 자동으로 설정된다 // automatic 은 아래로 내려 닫을 수 있다 // viewController...

article thumbnail
[ iOS ] CollectionView - 3
iOS 2023. 2. 22. 09:00

셀 데이터 / 셀 배치 (DataSource → DiffableDataSource) viewDidLoad 함수와 같은 레벨에 작성 UICollectionViewDiffableDataSource 의 Section, Item 의 타입은 Hashable 따로 작성한 구조체의 타입이 Hashable 인지 확인 var dataSource: UICollectionViewDiffableDataSource! typealias Item = AppleFramework // 별명 부여 enum Section { case main } viewDidLoad 함수 내부에 작성 dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView, cellPr..

article thumbnail
[ iOS ] PagingView
iOS 2023. 2. 20. 09:00

페이지 개수 설정 pageControl.numberOfPages = messages.count 가장 자연스럽게 스크롤 여부 확인 방법 스크롤 중 이벤트 func scrollViewDidScroll(_ scrollView: UIScrollView) { let index = Int(round(scrollView.contentOffset.x / self.collectionView.bounds.width)) // 반올림하여 정수자리만 남김 pageControl.currentPage = index } 스크롤 완료 시 이벤트 스크롤 속도 줄어들다 0이 된 경우 이벤트 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { }

article thumbnail
[ iOS ] CollectionView - 2
iOS 2023. 2. 17. 09:00

그리드 아이템별 간격 //아이템별 좌우 간격 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 1 } // 아이템별 위아래 간격 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 1..

article thumbnail
[ iOS ] Assistant 모드
iOS 2023. 2. 13. 09:00

Assistant 모드 단축키: Control + Command + Alt + Enter 컴포넌트 연결 Assistant 모드에서 컴포넌트를 직접 코드로 drag & drop 하여 연결한다. 이미지나 라벨 등의 컴포넌트는 변수로 연결되어 디자인 등을 수정 가능하며 버튼 등의 컴포넌트는 함수로 연결되어 동작에 대한 이벤트를 수정할 수 있다 @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var label: UILabel! @IBOutlet weak var button: UIButton! @IBAction func buttonTapped(_ sender: Any) { // print("버튼 눌림") reload() }

article thumbnail
[ iOS ] CollectionView - 1
iOS 2023. 2. 6. 09:00

ViewController 연결 …ViewController.swift 생성 후 스토리보드의 ViewController에서 Custom Class 의 Class 와 Identity의 Storyboard ID 를 수정한다 최초 로딩 관련 함수 viewWillAppear → viewDidLoad → viewDidAppear override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // print("viewWillAppear") } override func viewDidLoad() { super.viewDidLoad() // print("viewDidLoad") reload() // Do any additional setup..