나의 발자취

[iOS] 테이블뷰컨트롤러에서 데이터 추가/삭제하기 본문

앱 개발/iOS

[iOS] 테이블뷰컨트롤러에서 데이터 추가/삭제하기

달모드 2024. 10. 22. 13:58

disclaimer: 방탄 팬 아니지만 제공받은 리소스가 이것 뿐으로, 저작권 때문에 모자이크함.

unwind 세그 구현하기

 

리스트를 새로 추가하면 plist에 업데이트가 되면서, 뷰에도 나타날 것이다.

문제는, 새로 추가하는 화면에서 뒤로 가기를 해야한다. 

여기서 착각을 많이 하는 부분이 있는데,

데이터 로드는 테이블뷰에서 하기 때문에 Unwind 관련 메서드는 테이블뷰가 있는 MainTableViewController에서 해주어야 한다.

(viewWillAppear 는 하수.. 금지)

 

 

MainTableViewController.swift

ViewDidLoad 아래에 IBAction을 만들어준다.

 

Main.storyboard

 

 

exit에 마우스 우클릭을 해보면 방금 메인에서 만들었던 함수가 나온다.

 

라디오 버튼을 클릭해서 디테일 영역에 드래그하자. 그럼 Manual이라는게 나온다. 클릭하자.

 

 

그러면 옆에 Unwind segue "back" to "returnFromAddWithSegue"가 나온다.

 

이제 이걸 클릭해서 인스펙터 윈도우를 보면, Storyboard Unwind Segue 가 있고, 이것의 identifier를 "back"으로 설정해준다.

 

그다음 actSave()를 구현한 파일로 가서,

밑에다가 아래 코드를 작성해준다.

performSegue 를 매뉴얼로 해주었기 때문에, 아까의 identifier "back"을 적어준다.

 

 

 

그러나, 이렇게 하는 방법은 매우 비효율적이다.

왜냐하면 MainTableViewController.swift 에서 보았듯 tableView.reloadData()를 통해 데이터를 계속 리로드하기 때문이다.

 


새롭게 추가된 리스트만 뷰에 업데이트하기

따라서, 방금 만든 세그 되돌아가기 함수 returnFromAdd()에다가 indexPath 변수를 새로 선언해서 받아준다.

이렇게 하면 우리가 데이터를 전달해주지 않아도 해당 indexPath에 맞는 row가(cellForRowAt) 호출된다.

 

이렇게 앱을 실행해보면, 아래와 같이 앱이 터지게 된다.

즉 실행되는 타이밍이 안맞는다는 것이다. 저장이 완료되기 전에 읽어오니까 개수가 안맞아서. 에러가 난다.

그래서 이것을 해결하려면 bts를 넘겨줘야한다.

 

MainTableViewController.swift

로 가서, 최하단의 주석처리(Navigation)를 해제한 후 prepare()를 작성해준다.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         guard let AddImageViewController = segue.destination as? AddImageViewController else { return }
         AddImageViewController.bts = bts
     }

 

이렇게 넘기게 되면, 참조값이 넘어가게 된다.

 

그리고 이 데이터가 넘어가는 파일인 AddImageViewController.swift에서는 이 라인을 지워준다.(안지우면 다르게 동작함)

 

마지막으로 returnFromAdd에서도 해당 코드를 지워준다.


리스트 추가한 위치로 스크롤 이동

그리고 리스트를 추가했을 때 추가한 위치로 스크롤이 내려가는걸 구현하기 위해 MainTableViewController.swift의 returnFromAdd()에 아래와 같은 코드 한줄을 추가해준다.

 


 

새로 추가한 사진 이미지 썸네일 표시하기

또한, 새 리스트를 추가했을 때 이미지 썸네일이 지금 안뜬다.

 

지금 cellForRowAt을 보면, imgProfile은 named:imageName으로 가지고 오고 있다.

 

이 코드를 어떻게 고칠거냐면 멤버를 가지고와서, 이미지 이름이 'bts'로 시작하면 named:imageName으로 가져오고, 그게 아니면 타겟 경로를 가지고 와서 해당하는 컨텐츠로 이미지 프로필을 만들어야 한다.

일단, 처음 앱을 열었을 때 기존에 존재하는 사진(.plist)과, 새로 추가했을 때 추가되는 사진의 위치(Documents)를 콘솔로 찍어봤었는데 아래와 같다.

 

 

보면 경로는 이렇게 되어있다.

 

MainTableViewController의 cellForRowAt에 가서, 이것을 반영해준다.

 


포토 썸네일 일정한 크기로 바꾸기

메인 스토리보드에서 이미지뷰 객체를 선택하고, content modefmf Aspect Fit에서 Aspect Fill로 바꿔준다.

Comments