티스토리 뷰
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