본문 바로가기
개발일지/FLO Music App

개발일지 ) FLO - Music App 5일차 (10.21)

by 후르륵짭짭 2020. 10. 22.
728x90
반응형

 

진짜,,, 거의 끝을 보려고 하다,,,,

엄청나게 많은 시간을 사용했다...

거의다 구현은 했지만,,,, 정말 많은 시간을 사용 했다...

 

어려웠던 내용 )

** 데이터 전송 문제 **

정말 너무 많은 어려움이 존재 했다.

fluffy.es/3-ways-to-pass-data-between-view-controllers/

 

3 ways to pass data between view controllers (forth and back)

So now you have set up different view controllers in the storyboard and wanting to pass the input data gotten from one view controller to another for display purpose or processing. This post will show you 3 ways to do it and discuss when to use them. The 3

fluffy.es

일단 새로운 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를 구성하고 접근 한다고 오류가 발생 한다.

stackoverflow.com/questions/57897288/uitableviewalertforlayoutoutsideviewhierarchy-error-warning-once-only-ios-13-g )

 

UITableViewAlertForLayoutOutsideViewHierarchy error: Warning once only (iOS 13 GM)

I am getting a strange error with iOS13 when performing a Segue and I can't figure out what it means, nor can I find any documentation for this error. The problem is that this seems to cause a lot ...

stackoverflow.com

그리고 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

 

Apple Developer Documentation

 

developer.apple.com

0urtrees.tistory.com/54

 

UITableView scrollToRow, 특정 셀로 스크롤시키기

안녕하세요! 민군입니다 ^-^//  혹시 UITableView를 iOS개발 간 사용하실 때 특정 상황에서 특정 테이블뷰 위치로 이동시키고 싶으신적 없으신가요??  전 이미 그런 상황을 협업프로젝트를 해보며 경

0urtrees.tistory.com

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/

 

3 ways to pass data between view controllers (forth and back)

So now you have set up different view controllers in the storyboard and wanting to pass the input data gotten from one view controller to another for display purpose or processing. This post will show you 3 ways to do it and discuss when to use them. The 3

fluffy.es

 

TableVeiw의 특정 Cell에 접근하는 방법 :

stackoverflow.com/questions/44363940/how-to-refer-to-a-cell-outside-of-cellforrowatindexpath

 

How to refer to a cell outside of cellForRowAtIndexPath

I am trying to update a label in a cell outside of override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell by using let cell = tableV...

stackoverflow.com

 

TimeObserver 삭제하는 방법 :

developer.apple.com/documentation/avfoundation/avplayer/1387552-removetimeobserver

 

Apple Developer Documentation

 

developer.apple.com

자동으로 특정 셀 위치로 이동하는 방법 :

developer.apple.com/documentation/uikit/uitableview/1614997-scrolltorow

 

Apple Developer Documentation

 

developer.apple.com

테이블 뷰의 reloadData() completeHandler 추가:

stackoverflow.com/questions/16071503/how-to-tell-when-uitableview-has-completed-reloaddata

 

How to tell when UITableView has completed ReloadData?

I am trying to scroll to the bottom of a UITableView after it is done performing [self.tableView reloadData] I originally had [self.tableView reloadData] NSIndexPath* indexPath = [NSIndexPath

stackoverflow.com

segue로 데이터 전송하기 :

hururuek-chapchap.tistory.com/68?category=909178

 

IOS) PageViewController로 화면전환을 만들어보자!

안녕하세요 후르륵짭짭입니다! 이번에는 PageViewController를 이용해서 저렇게 화면 전환을 하는 것을 만들어 보도록 하겠습니다. ** 스토리 보드에 설정하기 ** 일단 이렇게 pageViewController를 만들고

hururuek-chapchap.tistory.com

 

728x90
반응형

댓글