티스토리 뷰

TIL

[TIL] 2022 / 07 / 19

희철 2022. 7. 19. 22:11

tableView.reloadData()

 

 

테이블뷰를 사용하다보면 셀의 데이터가 바뀔 때가 있음.

 

예를 들어, 버튼을 눌렀을 때 셀을 추가하는 등의 액션이 있는데 reload를 해주지않으면 반영되지 않음.

 

그래서 tableView.reloadData() 메서드를 꼭 실행해야함.

 

하지만 데이터가 바뀔때마다 reloadData()를 이용해서 모든 데이터를 갱신할 필요가 없을 수도 있음.

-> reloadSections나 reloadRows를 이용하면 특정 셀, 특정 섹션만 갱신할 수 있음.

 

 

TableViewCell Reuse mechanism

 

 

테이블뷰가 스크롤되면서 위의 셀이 사라지면 사라지는 셀은 queue로 들어가고, queue에 있는 셀이 올라와 보여지게되는 구조.

-> 이미 할당된 메모리의 셀을 재사용하기때문에 메모리의 손실이 없음.

 

 

TableViewCell height

 

 

두 가지 방법이 있음.

 

1. 테이블뷰 컨트롤러의 viewDidLoad()에 높이 정보 주기

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = 80
        
}

전체 셀의 높이를 통일할때 사용하면 좋음.

 

2. heightForRowAt 메서드 이용하기

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return CGFloat(60)
}

매개변수로 indexPath가 있는 것을 보면, 셀마다 높이를 다르게 하고 싶을때 사용하면 좋음.

 

다만, 둘 다 작성되어있는 경우엔 heightForRowAt이 더 나중에 실행되므로 우선순위가 더 크다고 볼 수 있음.

 

 

열거형 활용

 

 

지금까지 열거형을 사용할때 case만 활용했음.

 

아래처럼도 활용가능함.

enum SettingOptions: Int, CaseIterable {
    case whole, personal, others //섹션
    
    var sectionTitle: String {
        switch self {
        case.whole:
            return "전체 설정"
        case.personal:
            return "개인 설정"
        case.others:
            return "기타"
        }
    }
    
    var rowTitle: [String] {
        switch self {
        case .whole:
            return ["공지사항", "실험실", "버전 정보"]
        case .personal:
            return ["개인/보안", "알림", "채팅", "멀티프로필"]
        case .others:
            return ["기타"]
        }
    }
}

CaseIterable을 채택하면 열거형을 배열처럼 사용할 수 있음.

-> 배열의 메서드를 사용할 수 있음.

if indexPath.section == 0 {
    cell.textLabel?.text = whole[indexPath.row]
} else if indexPath.section == 1 {
    cell.textLabel?.text = personal[indexPath.row]
} else if indexPath.section == 2 {
    cell.textLabel?.text = other[indexPath.row]
}

위의 코드를 아래처럼 한 줄로 바꿀 수 있음.

cell.textLabel?.text = SettingOptions.allCases[indexPath.section].rowTitle[indexPath.row]

SettingOptions.allCases[0]은 첫번째 요소를 의미하므로 whole이라고 생각하면됨.

 

따라서 whole의 rowTitle의 요소가 0번째 인덱스부터 셀의 레이블에 들어가는거임.

 

 

Storyboard Reference

 

 

탭바에 네비게이션 컨트롤러가 임베드된 뷰컨트롤러를 레퍼런스로 연결할 때, 두 가지 선택지가 있음.

 

1. 각 스토리보드에서 뷰컨트롤러에 네비게이션 컨트롤러를 연결하는 방법

-> 스토리보드에서 디자인하기 편하지만 탭바 디자인을 코드로 작성해야함.

 

2. 탭바에 네비게이션을 한 스토리보드에 둠.(레퍼런스의 스토리보드에는 뷰컨트롤러만 있음)

-> 네비게이션 바의 타이틀이나 버튼같은 것을 코드로 구현해야하지만 탭바를 편하게 디자인 가능.

 

 

Extension

 

 

클래스, 열거형, 구조체 등의 객체를 확장하여 새로운 기능을 추가할 수 있는 구문

 

과도하게 사용할 경우, 객체를 다룰때 익스텐션의 모든 요소도 같이 가져오기때문에 무거워질 수도 있음.

 

익스텐션에는 저장 프로퍼티를 추가할 수 없음.

-> 프로퍼티 더 알아보기

 

override 불가능

 

반복해서 사용하는 것들을 익스텐션 내에서 함수로 만들면 간단하게 사용할 수 있음.

 

예를 들어, alert를 익스텐션 내에 함수로 만들어놓으면 뷰컨트롤러마다 한줄로 쉽게 구현 가능

 

extension UIViewController {
    
    func setBackgroundColor() {
        
        view.backgroundColor = .orange
        
    }
    
    func showAlert(title: String) {
        
        let alert = UIAlertController(title: title, message: "ㅇㅇㅇ", preferredStyle: .alert)
        let ok = UIAlertAction(title: "ok", style: .default, handler: nil)
        alert.addAction(ok)
        present(alert, animated: true)
      
    }
}
import UIKit

class TrendViewController: UIViewController {
    
    @IBOutlet weak var searchTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setBackgroundColor()
        searchTextField.borderColor()
    }
}

 

 

TableViewCell

 

 

커스텀셀을 만들때 오토레이아웃을 설정하면 여백이 살짝 남는 것을 볼 수 있음.

-> margin이 따로 있는데, 체크를 해제하면 신경안쓰고 레이아웃을 설정할 수 있음.

 

UIView를 셀의 상단쪽에 가져가면 넣는 공간이 있음.

-> 헤더 설정 가능. 만약 아래쪽에 가져다놓으면 푸터로 사용 가능.

 

테이블뷰는 스크롤뷰를 상속받고있으므로 스크롤이 가능함. 근데 만약 텍스트필드로 인해 키보드가 올라와있는 상태라면 거슬릴 수가 있음.

-> 스크롤을 할 시에 키보드를 내려줄 수 있음.

어트리뷰트 인스펙터에서 keyboard를 Dismiss on drag로 바꿔주면됨.

 

카카오톡이나 다른 어플들을 쓰다보면 셀을 스와이프해서 지우거나 편집하는 경우가 많은데 두 가지 방법으로 구현할 수 있음.

 

1. leadingSwipeActionsConfigurationForRowAt이나 trailingSwipeActionsConfigurationForRowAt

 

-> 카카오톡의 숨김, 차단같이 커스텀하게 만들 수 있음.

 

2.

위의 두 메서드를 이용하면 아래와 같이 삭제를 구현할 수 있음.

하지만 디폴트 기능이라 따로 커스텀하려면 1번의 방법으로 구현해야함.

 

 

'TIL' 카테고리의 다른 글

[TIL] 2022 / 07 / 21  (0) 2022.07.21
[TIL] 2022 / 07 / 20  (0) 2022.07.21
[TIL] 2022 / 07 / 18  (0) 2022.07.18
[TIL] 2022 / 07 / 17  (0) 2022.07.17
[TIL] 2022 / 07 / 16  (0) 2022.07.17
댓글
최근에 올라온 글
Total
Today
Yesterday