🧑💻 오늘까지 진행한 요구사항
이름순으로 정렬되게 하려면
테이블 뷰에 들어가는 배열을 정렬해야 한다.
배열을 정렬하는 방법은 생각보다 간단하다.
예를 들어 Person 이라는 구조체를 가진 배열 people가 있다면
struct Person {
var name: String
var age: Int
}
var people = [
Person(name: "마리오", age: 28),
Person(name: "루이지", age: 27),
Person(name: "동키콩", age: 26),
Person(name: "데이지", age: 25)
]
이 people 배열을 정렬하는 방법은 sorted 함수를 사용한다
let sortedPeople = people.sorted { $0.name < $1.name }
name을 기준으로 오름차순 (가나다순) 정렬된다.
let sortedPeople = people.sorted { $0.name.lowercased() < $1.name.lowercased() }
위와 같은 코드로 작성하면 대소문자 구분 없이 정렬도 가능하다!
✓ TIL
내 코드에서는 아래와 같이 적용하였다.
// CoreData에서 불러온 연락처 배열
var contactsTableData: [ContactsModel] = []
private func sortData() {
let sortedContactsTableData = contactsTableData.sorted { $0.name < $1.name }
contactsTableData = sortedContactsTableData
}
배열 정렬을 위한 sortData() 함수를 작성하였다.
sortData 함수에서 contactsTableData를 name을 기준으로 오름차순 정렬을 수행한 뒤
sortedContactsTableData를 다시 contactsTableData에 넣어준다.
// 저장된 데이터 읽어오기
private func readAllData() {
contactsTableData = []
do {
let contactsData = try self.container.viewContext.fetch(Contacts.fetchRequest())
for data in contactsData as [NSManagedObject] {
if let name = data.value(forKey: Contacts.Key.name) as? String,
let phoneNumber = data.value(forKey: Contacts.Key.phoneNumber) as? String,
let imageUrl = data.value(forKey: Contacts.Key.imageUrl) as? String{
print("name: \(name), phoneNumber: \(phoneNumber), imageUrl: \(imageUrl)")
contactsTableData.append(ContactsModel(name: name, phoneNumber: phoneNumber, imageUrl: imageUrl))
}
}
sortData()
} catch {
print("데이터 읽기 실패")
}
}
sortData 함수는 CoreData를 불러오는 readAllData 함수에서 실행된다.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.isHidden = true
// CoreData
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.container = appDelegate.persistentContainer
readAllData()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
readAllData 함수는 viewWillAppear 에서 실행되며 ContactsViewController에서 사용자가 연락처 추가를 마친 후 실행되며
tableView.reloadData()는 imageView도 다시 그려주기 때문에 메인 쓰레드에서 작업해야 한다.
📱 Simulator
왼쪽은 정렬 전 / 오른쪽은 정렬 후
왼쪽 시뮬레이터는 데이터를 추가하면 테이블 뷰의 맨 아래쪽에 데이터가 표시되고,
오른쪽 시뮬레이터는 데이터를 추가하면 이름순에 맞게 오름차순 정렬되어 데이터가 표시된다.
'스파르타 코딩 클럽 - iOS 스타터 6기 > 본 캠프' 카테고리의 다른 글
39. 스파르타 코딩 클럽 - 킥보드 대여 앱 만들기 (1) (1) | 2025.04.25 |
---|---|
38. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (5) (0) | 2025.04.24 |
36. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (3) (0) | 2025.04.21 |
35. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (2) (1) | 2025.04.18 |
34. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (1) (1) | 2025.04.17 |