Taehyeon-Kim / SeSAC

☀️ SeSAC Daily Reporting
27 stars 0 forks source link

[220808] TIL #93

Closed Taehyeon-Kim closed 2 years ago

Taehyeon-Kim commented 2 years ago

상수 관리, API Key 관리

enum

struct

URL Endpoint 분리하기

enum EndPoint {
    case blog
    case cafe

    var requestURL: String {
        switch self {
        case .blog:
            return URL.makeEndPointString("blog?query=")
        case .cafe:
            return URL.makeEndPointString("cafe?query=")
        }
    }
}
extension URL {
    static let baseURL = "https://dapi.kakao.com/v2/search/"

    static func makeEndPointString(_ endPoint: String) -> String {
        return baseURL + endPoint
    }
}

프로퍼티

네트워크 호출

image

네트워크 호출을 하고 난 후 Response가 오는 시점은 언제인지 알 수 없다. 화면에 TableView 또는 CollectionView가 그려질 때 아직 서버에서 데이터를 못 받아왔다면 화면에 그릴 내용이 없을 것이다. 화면을 이미 그린 후에 데이터가 도착했다고 생각해보자.

어떻게 해야 할까? 데이터가 완전히 받아와진 시점에 화면을 다시 그려줄 필요가 있다. 그럴 때 사용하는 메서드가 reloadData()이다. reloadData()를 호출하게 되면 아이템, 행을 몇 개 그릴지 어떤 셀을 꺼내올건지 등등에 대한 작업을 다시 수행하게 된다.

UITableView.AutomaticDimension

tableView.rowHeight = UITableView.automaticDimension
extension ViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        // 분기 처리를 해서도 조정할 수 있다.
        // 더 우선적으로 호출된다. (메서드가 우선한다. - viewDidLoad에서 호출되는 것과 비교했을 때!!)
        return UITableView.automaticDimension
    }
}

만약에 특정 셀은 고정적인 높이를 주고 싶고, 나머지 셀은 유동적으로 높이를 조정하고 싶다고 한다면 Delegate method에서 처리를 해줄 수 있다. 이 때 해당 메서드가 우선순위가 높아서 더 우선적으로 호출된다.

셀 확장, 축소 구현하기 (Label 기준, 간단한 UI)

Label의 numberOfLines 속성을 이용해서 셀이 확장, 축소되는 듯한 UI를 구현해볼 수 있다.

var isExpanded = false // false면 2줄, true면 0으로

우선 분기처리를 해줄 수 있는 Bool 타입의 변수를 하나 선언한다.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "KakaoCell", for: indexPath) as? KakaoCell else {
            return UITableViewCell()
        }

        cell.testLabel.numberOfLines = isExpanded ? 0 : 2
        cell.testLabel.text = indexPath.section == 0 ? blogList[indexPath.row] : cafeList[indexPath.row]
        return cell
    }

그리고 cellForRowAt 메서드 쪽에서 변수의 값에 따라서 numberOfLines 값을 조정해주면 된다.

@IBAction func showTotalButtonTapped(_ sender: UIBarButtonItem) {
    isExpanded.toggle()
    tableView.reloadData()
}

그리고 가장 중요한 것은 tableView를 다시 그려주는 작업이다. 까먹지 말자.