Project56 [UIKit] TableView 위에 Header를 만들어보자 오늘은 UITableVIew에 Header를 만드는 방법을 기록할거에요. 사진 속에서 프로필 사진, 이름, 전화번호, 유저아이디가 있는 영역이 오늘 작업할 Header에요. 1. ProfileHeader를 만들어주세요. class ProfileHeader: UITableViewHeaderFooterView { // MARK: - Properties var vm: ProfileHeaderViewModel? { didSet { configure() } } private let profileImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.clipsToBounds = true iv.backgroundCol.. 2023. 4. 22. [UIKit] UISearchController, 검색 기능 구현하기 UISearchController를 활용해서 검색 기능을 구현해보았습니다. 구현한 화면은 다음과 같습니다. btc, 비트코인, bitcoin과 같은 검색어를 입력하면 필터링한 리스트를 새롭게 보여줍니다. 1. UISearchController를 생성해줍니다. 검색 중인지 상태를 알 수 있는 inSearchMode 변수도 만들어주었어요. private let searchController = UISearchController(searchResultsController: nil) private var inSearchMode: Bool { return searchController.isActive && !searchController.searchBar.text!.isEmpty } 2. 초기 설정을 해주어요. .. 2023. 4. 17. [UIKit] 업비트 API로 CollectionView에 리스트 만들기 feat.RxCocoa 지난 글에서 API로 데이터를 받아온 이후에 CollectionView가 새롭게 그려지지 않았던 문제를 해결하였습니다. UIKit 강의를 보니 데이터가 변경되었을 때 직접 reloadData()를 호출해서 갱신해주어야 하더라고요. @escaping 혹은 asycn/await을 사용해서 데이터를 받아온 이후 실행하는 방법도 있었지만, 저는 싱글톤 패턴을 사용해서 하나의 변수에 코인 리스트를 저장해서 변수의 값이 업데이트되었을 때 reloadData()를 호출하는 방법을 선택하였습니다. import Foundation import RxCocoa class UpbitRestApiService { static let shared = UpbitRestApiService() let coinsSubject = Beh.. 2023. 4. 13. [UIKit] CollectionView가 먼저 생성되고 데이터가 갱신되지 않는 문제 UIkit을 활용하여 코인리스트를 만드는 도전을 진행 중입니다. 블록와이드를 만들며 작업했던 흐름으로 @Publisher를 활용해서 winnerList 배열을 만들고 API로부터 데이터를 받아와서 업데이트 하는 구조인데요. 앱을 빌드하면 데이터를 받아오기 전에 비어있는 0 값이 출력되고 있으며, 그에 따라서 화면에는 코인리스트가 생성되지 않고 있습니다. SwiftUI에서는 @Publisher의 값이 수정되면 자동으로 값이 갱신되서 뷰가 새롭게 그려졌는데 UIKit에서는 다르게 작동하는 것 같네요. UI를 그리고 임시 리스트를 보여주는 것까지는 성공했는데 데이터를 갱신해주는 것에 대해서 공부를 해야하겠습니다. RxSwift가 그 힌트가 될 것 같아요. SwiftUI로는 업비트 웹소켓으로 매초마다 데이터를 .. 2023. 4. 7. URLSessionWebSocketTask로 업비트 WebSocket (웹소켓) 사용하기 어제 새벽까지 작업했던 첫번째 시도가 실패한 이후, 드디어 오늘 업비트 웹소켓 연결 이후 JSON 파싱까지 성공하였습니다! 어제 실패한 이유는 웹소켓에서 오는 데이터를 파싱하는 방식이 서툴렀기 때문이었어요. 예를 들어서 Json 파싱을 위한 Model을 살펴보면, 업비트의 RestAPI에서는 "KRW-BTC"가 market이라는 필드명을 가진 반면, WebSocket에서는 code라는 필드명을 가지고 있어요. 그래서 Model을 수정해야 했어요. 또한 트래픽이 많은 경우 사용하는 방법으로 축약형 필드명를 소개하고 있어서, Model의 코딩키를 축약형으로 바꿔야 했어요. 또 다른 어려웠던 점은, URLSessionWebSocketTask에서 receive의 Success 케이스에는 string과 data .. 2023. 3. 9. RestAPI vs WebSocketAPI. 현재 해결해야 할 문제 블록와이드에 CoinGecko RestAPI로 받아오던 코인 정보를 업비트 RestAPI를 활용해 교체하려는 시도를 했습니다. 결과적으로는 성공하였습니다. 하지만 그리 만족스럽지는 못했는데요. 지금까지 작업한 코드는 아래와 같습니다. import Foundation import Alamofire import Combine class UpbitCoinDataService { @Published var coins = [UpbitCoin]() @Published var tickers = [UpbitTicker]() private let baseUrl = "https://api.upbit.com/v1" private var cancellables = Set() init() { fetchCoins() } priv.. 2023. 3. 7. 이전 1 2 3 4 5 ··· 10 다음