1. TextView placeholder
텍스트뷰에는 placeholder가 없기 때문에 따로 구현해주어야한다😳
textViewDidBeginEditing과 textViewDidEndEditing함수를 이용했다
텍스트뷰가 비어있으면 "내용을 입력해주세요"를 lightGray컬러로 입력해주었다.
입력할때에 UIColor가 lightGray이면 해당 텍스트뷰의 aboutContent는 비어있고, "내용을 입력해주세요"가 입력된 상태이다.
따라서 텍스트뷰를 비워주고 입력하는 텍스트의 UIColor는 label로 설정하여 다크모드에서도 원활하게 작동할 수 있도록 하였다
func textViewDidBeginEditing(_ textView: UITextView) {
if view.frame.origin.y == 0 {
self.view.frame.origin.y -= 200
}
if textView.textColor == UIColor.lightGray { // 1번
textView.text = nil
textView.textColor = UIColor.label
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if view.frame.origin.y != 0 {
self.view.frame.origin.y = 0
}
if textView.text.isEmpty { // 2번
textView.text = "내용을 입력해주세요."
textView.textColor = UIColor.lightGray
}
print(view.frame.origin.y)
}
2. 코어데이터 문제 해결
코어데이터에 대해서 개념이 부족했다😅
스터디를 하면서 내 프로젝트의 문제점(코어데이터)을 발견했다
우선 fetchLB함수를 살펴보면, mainContext에서 fetch할때 life[_tag]배열에 넣어주는 부분이 있다.
func fetchLB(_tag : Int){
let request : NSFetchRequest<LB> = LB.fetchRequest()
//iDidIt을 기준으로 정렬
//let sortByBool = NSSortDescriptor(key : "iDidIt", ascending: true)
//request.sortDescriptors = [sortByBool]
do{
try life[_tag] = mainContext.fetch(request) as [LB]
}catch{
print(error)
}
}
나는 이 부분에 대한 개념이 확실하지 않았기 때문에, 버킷리스트의 폴더별로 각각 fetch를 따로 해주면 life 배열에 따로 들어간다고 생각했다. 바보같은 생각이었다❗️어디에도 mainContext가 배열이라는 말도 없고 표현해주지 않았다
life[0] = mainContext[0]
life[1] = mainContext[1]
...
life[6] = mainContext[6]
실제로 다음과 같이 작동하고 있었다. life[_tag]에 코어데이터의 모든 데이터를 가져오는 것이다.
life[0] = mainContext
life[1] = mainContext
...
life[6] = mainContext
데이터를 수정하고 추가하는 작업은 life배열에 직접 접근하고 saveContext()해주었기 때문에 잘 작동하는 것처럼 보였지만,
앱을 재실행하였을 때에는 첫번째 폴더에서 모든 버킷리스트들이 뜨는 문제가 발생했다
다음과 같이 수정하였다.
❗️1. 코어데이터 LB entity에 폴더를 나타내는 kinds attribute를 추가한다.
❗️2. Life탭을 선택했을 때 fetchLB함수와 setLB함수를 호출한다.
👉 fetchLB에서는 코어데이터를 불러와 저장하는 배열을 만든다.
👉 setLB에서는 fetchLB에서 저장한 배열을 폴더에 따라 분류해 저장하는 배열을 만든다.
SecondVC의 viewDidLoad()
override func viewDidLoad() {
super.viewDidLoad()
DataManger.shared.fetchLB()
DataManger.shared.setLB()
tableView.delegate=self
tableView.dataSource=self
}
fetchLB함수는 다음과 같이 수정했다.
func fetchLB(){
let request : NSFetchRequest<LB> = LB.fetchRequest()
do{
try fetchLife = mainContext.fetch(request)
}catch{
print(error)
}
}
setLB함수는 다음과 같이 작성했다.
func setLB(){
for i in 0...fetchLife.count-1{
let index = Int(fetchLife[i].kinds)
life[index].append(fetchLife[i])
}
}
코어데이터에 함께 저장된 kinds를 기준으로 life배열에 저장했다.
❗️3. LB를 수정하는 함수(editLB)는 따로 정의해준다
func editLB(_cellNum : Int, _detailCellNum : Int){
let index = fetchLife.index(of: life[_cellNum][_detailCellNum])
fetchLife[index!] = life[_cellNum][_detailCellNum]
saveContext()
}
데이터를 수정하기 위해서는 코어데이터를 직접 수정해야한다. 코어데이터에 직접 접근하기 위해서는 해당 데이터의 index를 알아야한다.
index(of:)으로 index의 값을 찾고 fetchLife[index]에 해당 데이터를 대입해주었다.
'기록 > 공부기록👩🏻💻' 카테고리의 다른 글
[공부기록]100일_28일차 (0) | 2020.10.04 |
---|---|
[공부기록]100일_27일차 (0) | 2020.10.03 |
[공부기록]100일_25일차 (0) | 2020.10.01 |
[공부기록]100일_24일차 (0) | 2020.09.30 |
[공부기록]100일_23일차 (0) | 2020.09.29 |