Swift/UIKit
-
[UIKit] addSubview 리팩토링 해보기Swift/UIKit 2022. 11. 28. 15:37
import UIKit extension UIView { func addSubviews(_ views: UIView...) { for view in views { addSubview(view)} } } 리팩토링 전 👇👇 view.addSubview(stackView) view.addSubview(actionButton) 리팩토링 후 👇👇 view.addSubviews(stackView, actionButton) 괜찮은건가..?
-
[UIKit] MVVM(Combine) 과 UITableViewDiffableDataSource 같이 써보기Swift/UIKit 2022. 11. 28. 14:17
Async/Await, MVVM, Combine, TableDiffableDataSource 를 같이 사용해보았다 VC 에서 TableView와 DataSource 를 들고 있고 MVVM 에서 실제 Data 와 FetchRequest 를 요청하는 함수를 실행한다 APIClient 는 실제로 요청을 보낸다 // ViewController enum Section { case main } var tableView: UITableView! var dataSource: UITableViewDiffableDataSource! private let viewModel = ViewModel() private var cancelBag = Set() func configureTableView() { tableView = U..
-
[UIKit] UICollectionViewDiffableDataSource에 대해 알아보자Swift/UIKit 2022. 11. 27. 18:38
What is iOS 13 부터 지원되는 CollectionView 와 TableView 에서 정보를 화면에 뿌려주는 방법중하나이다. 보통 datasource delegate method 를 통해 화면에 뿌려주곤한다. 하지만 델리게이트를 사용하지 않고도 UICollectionViewDiffableDataSource 를 사용하면 보자 자연스럽게 애니메이션을 더해서 화면에 정보를 뿌려줄수 있다. Why delegate method 를 통해 구현된 화면은 보여줘야할 정보가 변경될때 예를 들면 검색창을 통해 입력이 들어와 필터링 해줘야한다면 화면이 바뀌어야하는데 기존에는 reloadData() 를 통해 화면을 새로 그려주었는데 그렇게 되면 화면이 애니메이션없이 뚝뚝 끊기게 된다면 그렇기 때문에 좋지 못한 UX ..
-
[UIKit] frame vs boundsSwift/UIKit 2022. 11. 25. 23:26
func add(childVC: UIViewController, to containerView: UIView) { addChild(childVC) containerView.addSubview(childVC.view) childVC.view.frame = containerView.frame childVC.didMove(toParent: self) } func add(childVC: UIViewController, to containerView: UIView) { addChild(childVC) containerView.addSubview(childVC.view) childVC.view.frame = containerView.bounds childVC.didMove(toParent: self) } frame..
-
[UIKit] Modal에 대해 알아보자Swift/UIKit 2022. 11. 19. 10:55
오늘 알아볼 내용은 modal 이다 참고로 GFAlertVC 는 UIViewController 를 상속받고 있다. .overFullScreen -> 아래에서 보는거 처럼 전체 화면을 옅게 덮는다 .crossDissolve -> 페이드아웃되는 애니메이션 효과 나머지 써보면서 알아보자... import UIKit extension UIViewController { func presentAlertOnMainThread(title: String, message: String, buttonTitle: String) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } let alertVC = GFAlertVC(title:..
-
[UIKit] View 탭할때 키보드 없애주기Swift/UIKit 2022. 11. 18. 18:10
self.view -> View 를 탭할 경우 UIView.endEditing -> 에딧을 끝낸다 (키보드를 내리겠다) 해당 액션을 선언후 view 에 해당 탭 recognizer 를 추가해주어야한다. import UIKit class SearchVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() createDismissKeyboardTapGesture() } func createDismissKeyboardTapGesture() { let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing)) view.addGestureRecog..
-
[UIKit] Combine 사용해서 MVVM 구현해보기 : code 읽어보자Swift/UIKit 2022. 7. 30. 01:39
Controller의 code이다 viewModel을 init 해주고 있으며 내부의 instance method인 viewDidLoad를 호출한다 setupViewModel이 호출되면 이런 내용이 실행된다 대충 읽어 보면 viewModel의 ObservableProperty이 people를 계속해서 읽는데, .receive될 경우 == 값이 변하면 main에서 스케쥴링한다 == 일빠따로 처리해라 .sink는 값이 새로 들어왔을때 뭘할지 후행 closure로 처리해준다 데이터 후처리이다 보면 알겠지만 뷰 새로 그려준다 근데 여기서 의문인데 이름이 바뀐게 아닌가 싶다 .sink를 .onRecieve 라고 했다면 더 직관적인거 아닌가? 그리고 .receive는 .schedule(on: ) 이라고 했으면 더 직..