이전 화면에 코드'만' 작성
@IBAction func unwindToCalendar(_ segue: UIStoryboardSegue) {
}
다음 화면에서 버튼 exit 연결 후 함수 선택
UserDefaults | DataBase |
---|---|
단일 데이터 값 (경량) | 유사한 대량 데이터 값 (중량) |
자동 로그인 여부, 알림 수신 여부, 인앱 결제 여부 이메일, 닉네임, 성별 등 간단한 사용자 기본 설정 앱 테마, 앱 첫 실행, 팝업 다시 보지 않기 등 | 제목, 메모, 별점, 배우, 줄거리 등 영화 관리 데이터 감정, 내용, 위치, 날짜 등 작성한 일기 데이터 상대방과 주고받은 채팅 내역 데이터 |
Apple에서 제공해주는 key-value 형태의 기본 저장소 | Core data (by Apple) Realm, SQLite |
// property wrapper 사용
@propertyWrapper
struct TwelveOrLess {
private var number: Int
init() {
self.number = 0
}
var wrappedValue: Int { // wrappedValue 네이밍 필수
get { return number }
set { number = min(newValue, 12) }
}
}
struct SmallRectangle {
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
var rectangle = SmallRectangle()
print(rectangle.height) // 0
rectangle.height = 10
print(rectangle.height) // 10
rectangler.height = 24
print(rectangle.height) // 12
// 기존 코드
struct SmallRectangle {
var height: Int {
get { self.height }
set { self.height = min(newValue, 12) }
}
var width: Int {
get { self.width }
set { self.width = min(newValue, 12) }
}
}
// projected Value
@propertyWrapper
struct SmallNumber {
private var number = 0
var projectedValue = false // projectedValue 네이밍 사용 필수
var wrappedValue: Int {
get { return number }
set {
if newValue > 12 {
number = 12
projectedValue = true // 값이 조정되었다는 뜻으로 사용
else {
number = newValue
projectedValue = false
}
}
}
init() {self.number = 0}
}
struct SomeStruct {
@SmallNumber var num: Int
}
var s = SomeStruct()
s.num = 4
print(s.num) // wrappedValue 접근
print(s.$num) // projectedValue 접근
TableView = Section + Cell
TableView
Section
Cell
dequeReusableCell
section의 개수 (디폴트 : 1)
override func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
section의 헤더 이름 (디폴트 : nil)
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return (section == 0) ? "첫 번째 섹션" : "첫 번째가 아닌 섹션"
}
section의 cell 개수 (디폴트 : 1)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (section == 0) ? studyList.count : anotherList.count
}
section의 cell 데이터 및 디자인 처리
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "todoCell")!
// [0, 0] 좌표에서 앞 : section / 뒤 : row 라고 생각하면 될 듯
if (indexPath.section == 0) {
cell.textLabel?.text = studyList[indexPath.row]
}
else {
cell.textLabel?.text = anotherList[indexPath.row]
}
return cell
}
section의 cell 높이
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0 {
return 90
} else if indexPath.row == 1 {
return 150
}
return 50
}
// 매번(셀마다) 위 함수를 실행시키는 건 좀 비효율적이고,
// viewDidLoad에서 모든 셀의 높이를 통일시키는 방법이 있다
// 모든 셀이 같은 높이를 가지면 아래 방식이 더 낫다
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 60
}
화면 새로 로드
tableView.reloadDate()
셀 선택 시
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("select", indexPath)
//tableView.deselectRow(at: indexPath, animated: true)
}