하이염
오늘은 테이블뷰 구성하는 메커니즘에 대한 3차..? 복습을 했어요
아이고 헷갈리라
코드 작성하고 주석으로 정리함 레츠고!
//
// ChatViewController.swift
// Flash Chat iOS13
//
// Created by Angela Yu on 21/10/2019.
// Copyright © 2019 Angela Yu. All rights reserved.
//
import FirebaseFirestore
import FirebaseCore
import FirebaseAuth
import UIKit
class ChatViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var messageTextfield: UITextField!
private var messages: [Message] = []
let db = Firestore.firestore()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
self.title = "Flash chat"
// ✅ 테이블 뷰 데이터 소스 설정
self.tableView.dataSource = self
// ✅ 테이블 뷰 register 설정
self.tableView.register(
UINib(nibName: K.cellNibName, bundle: nil),
forCellReuseIdentifier: K.cellIdentifier)
self.loadMessages()
}
@IBAction func logout(_ sender: UIBarButtonItem) {
do { try Auth.auth().signOut() // ✅ 로그아웃 시키고
self.navigationController?.popToRootViewController(animated: true) // ✅ 루트 뷰로 감
}
catch let error as NSError {
print(error)
}
}
// 복습하기 ⭐️
@IBAction func sendPressed(_ sender: UIButton) {
// ✅ sender에 email 할당
guard let sender = Auth.auth().currentUser?.email else { return }
// ✅ body에 메세지 내용 할당
guard let body = messageTextfield.text else { return }
guard body.isEmpty == false else { return }
// ✅ Firebase Forestore에 딕셔너리 구조로 업로드
db.collection(K.FStore.collectionName).addDocument(data: [
"sender": sender,
"body": body
])
}
func loadMessages() {
// ✅ Documents 불러옴
db.collection(K.FStore.collectionName).getDocuments { querySnapShot, error in
guard error == nil else { return }
guard let snapShotData = querySnapShot?.documents else { return }
for doc in snapShotData {
// ✅ data에 snapShotData data 할당
let data = doc.data()
guard let sender = data["sender"] as? String else { return }
guard let body = data["body"] as? String else { return }
// ✅ Messgae에 sender, body로 값 올리기
var message = Message(sender: sender, body: body)
self.messages.append(message)
}
// ✅ 화면에 뿌리기
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
extension ChatViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.messages.count
}
// 각 셀에 어떤 내용을 표시할지 반환
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ✅ MessageCell 구성하는 cell 정의
let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for: indexPath) as! MessageCell
// ✅ cell text에 indexPath.row로 해당하는 값 각각 할당
cell.label.text = self.messages[indexPath.row].body
return cell
}
}
'TIL' 카테고리의 다른 글
250520 TIL | 셀 재사용부터 앱 생명주기까지 (0) | 2025.05.20 |
---|---|
250511 TIL | 메모리 누수, Firebase Firestore, SPM, TableViewCell 등등 (0) | 2025.05.11 |
250507 TIL | FireStore 사용법 익히기, 딕셔너리 활용 (0) | 2025.05.07 |
250506 TIL | Firebase Firestore 데이터 가져오기, 연휴 끝🙀 (0) | 2025.05.06 |
250418 TIL | 순수함수, 표기법, 생명주기 | 불금엔 카공이지,,,웅웅 (0) | 2025.04.18 |