진짜,,, 거의 끝을 보려고 하다,,,,
엄청나게 많은 시간을 사용했다...
거의다 구현은 했지만,,,, 정말 많은 시간을 사용 했다...
어려웠던 내용 )
** 데이터 전송 문제 **
정말 너무 많은 어려움이 존재 했다.
fluffy.es/3-ways-to-pass-data-between-view-controllers/
일단 새로운 LyricViewController 를 만들었다. 새로운 뷰를 만드는 것은 어렵지 않았다...
하지만 PlayerViewController 에서 LyricViewController 로 현재 음악 재생 시간을 양측이 모두 보내줘야 해서
Segue와 일반적은 방법으로 연결 시켰다.
처음에는 잘 되는 줄 알았는데,,,, PlayerViewController에서 현재 재생 시간을 보내주면 LyricViewController에서 갱신이 안 되는 것이다....
이렇게 데이터를 보내주면 getData에서 받아서 특정 Cell에 접근해서 글자를 바꿔줘야한다..
하지만,,,,
작동이 안된다,,,,, 왜 같은 ViewController이고 print() 하면 잘만 나오는데,,, 왜 그럴까 많은 생각을 했는데,,,
내가 추론하기로는,,,
self.storyboard?.instantiateViewController(withIdentifier: "LyricViewController")
이렇게 데이터를 전송 했을 때, segue로 생성한 LyricViewController로 데이터가 전송이 안되는 것 같다,,,
그래서 정말 많은 생각을 고민 한 결과!!!! 싱글톤인 PlayerViewModel 에 새로운 메소드를 추가해준다.
그리고 LyricViewController에서도 이 메소드를 사용해서 재생 시간을 추적해준다!!!
물론 LyricViewController 와 PlayerViewController 양쪽 모두,,,, 사용하지만 어쩔 수 없었다.
이렇게 timeObserver를 제거 안해주면 두 곳에서 돌기 때문에 view가 사라질 예정일 때 중지 시켜준다.
** 현재 자막 추척하기 **
와,,,, 이 부분에서 진짜 애먹었다....
일단 이렇게,, ViewDidAppear 시점에,, 현재 노래 시간을 추척한다...
(ViewDidAppear 시점에 안하면 뷰가 생성되기전에 tableView를 구성하고 접근 한다고 오류가 발생 한다.
그리고 4일차에 구현한 이진탐색으로 가장 가까운 녀석을 찾고 CellforRowAT을 사용해서 특정 셀에 접근하기 위해 IndexPath 형태로 만들어준다.
그리고 updateCellLable() 함수를 만들어줘서 현재 자막을 강조 해준다...
하지만 여기서 엄청 핵 고생을 했다.
//5일차
func updateCellLabel(input : IndexPath ){
if self.indexpath == nil {
guard let table = self.lyricTableView.cellForRow(at: input) else {return}
guard let cell = table as? LyricTableViewCell else{return}
cell.changeLyricLableUI(color: .orange)
self.indexpath = input
}
else{
//현재 indexPath가 보여지지 않을 경우에는 오류가 발생한다.
//이 부분을 해결해줘야한다.
//그래서 계속 추적이 필요하다.
guard let beforeTable = self.lyricTableView.cellForRow(at: self.indexpath! ) else {
print("1")
self.indexpath = nil
return}
guard let beforeCell = beforeTable as? LyricTableViewCell else{
print("2")
self.indexpath = nil
return}
beforeCell.changeLyricLableUI(color: .black)
guard let table = self.lyricTableView.cellForRow(at: input) else {
print("3")
self.indexpath = nil
return}
guard let cell = table as? LyricTableViewCell else{
print("4")
self.indexpath = nil
return}
cell.changeLyricLableUI(color: .orange)
self.indexpath = input
}
}
엄청나게 긴데,,, 여기서 print(1)이 계속 찍히는 것이다....
아니,, indexPath는 존재하는데,,, 왜 계속 튕기는 거지 생각 했는데,,, 이건 테이블 뷰의 문제 때문이 였다.
테이블 뷰에 50개의 셀을 생성하더라도 우리에게 보여주는 것은 8개? 10개? 이렇게 된다.
따라서 내가 20 번째 셀을 지워달라고 해도,, 현재 보여주는 셀에는 20번째가 안 보이기 때문에 삭제 할 수가 없다....
(이것 때문에 내가 엄청 시간을 썼다.... 후우)
developer.apple.com/documentation/uikit/uitableview/1614997-scrolltorow
ScrollToRow를 사용해서 계속 맨 위를 가리키게 했다.
self.lyricTableView.scrollToRow(at: input, at: .top, animated: true)
이렇게 특정 부분으로 계속 위로 올라가 하는 것이다!!!
또한 특정 셀을 눌렀을 때 자주 발생 하는 문제 이기 때문에,
//5일차
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 버튼을 눌러서 토글이 켜져 있을 때만 선택 할 수 있도록 해야함.
//핸들러를 이용해서 데이터 재전송 backword
handler?(stringLyrics[indexPath.row].time)
lyricTableView.reloadData()
self.indexpath = nil
}
이렇게 다시 테이블을 reload 해주고 indexPath를 없는 것(nil)으로 해준다!
그래야지 처음 상태로 돌아가기 때문에 오류 없이 작동 한다.
하지만 끝난게 아니다,,,, 가끔가다가,,, 강조 부분이 사라지지 않았다... ㅠㅠ
왜냐하면 indexPath를 nil로 했기 때문에,,, 원래 하일라이트 된것이 안 없어지기 때문이다.
그래서 셀 뷰로 가서 prepareForReuse()를 사용해서 다시 사용 될 때는 검정으로 바꿔줬다!
(이렇게 하는 것이 근본적인 해결 책인지는 모르겠다.)
참고 사이트 :
ViewController 간의 데이터 전송
fluffy.es/3-ways-to-pass-data-between-view-controllers/
TableVeiw의 특정 Cell에 접근하는 방법 :
stackoverflow.com/questions/44363940/how-to-refer-to-a-cell-outside-of-cellforrowatindexpath
TimeObserver 삭제하는 방법 :
developer.apple.com/documentation/avfoundation/avplayer/1387552-removetimeobserver
자동으로 특정 셀 위치로 이동하는 방법 :
developer.apple.com/documentation/uikit/uitableview/1614997-scrolltorow
테이블 뷰의 reloadData() completeHandler 추가:
stackoverflow.com/questions/16071503/how-to-tell-when-uitableview-has-completed-reloaddata
segue로 데이터 전송하기 :
hururuek-chapchap.tistory.com/68?category=909178
'개발일지 > FLO Music App' 카테고리의 다른 글
개발일지) FLO - Music App 7일차 (11.09) (0) | 2020.11.09 |
---|---|
개발일지 ) FLO - Music App 6일차 (10.22) (4) | 2020.10.24 |
개발일지 ) FLO - Music App 4 일차 (10.20) (0) | 2020.10.22 |
개발일지 ) FLO - Music App 3일차 (10.19) (0) | 2020.10.21 |
개발일지 ) FLO - Music App 2일차 (10.18) (0) | 2020.10.19 |
댓글