적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Project/ToyProject_Couple App

[Swift iOS] 입력값을 받아와 tableView에 띄우기 - 데이터 내부 저장 방법 AppDelegate

hongssup_ 2021. 3. 13. 00:50
반응형

modal 창을 띄워 입력값을 받아와 tableview에 띄우고 싶었는데 안되더라. 

데이터가 왜 넘어가지 않는 것이야!!!! 

받아올 없는 데이터에 씁쓸함을 안고 검색도 해봤지만 해답을 찾지 못하고 도서관에와 책을 뒤적뒤적거리다가 발견.

 

해결 방법은 'AppDelegate' 파일에다가 데이터를 저장할 배열 변수를 프로퍼티로 정의하는 것!!

배열 변수를 AppDelegate 클래스에 저장하는 것은 [ 접근성 / 데이터 보존 / 일관성 ] 크게 이 세 가지 이슈 때문이라고 한다.  

 

나는 그냥 모달이나 테이블 뷰가 있는 뷰 컨트롤러 클라스에 배열 변수를 생성해 저장하고 불러오고 그랬는데, 이렇게 저렇게 아무리 해봐도 입력된 값이 테이블뷰에 뜨지 않는 것이었다ㅠㅠ 그 이유는 뷰 컨트롤러는 생명 주기가 길지 않아 사용자가 페이지를 닫거나 이전 화면으로 돌아가는 순간 데이터가 모두 소멸될 수 있다고 한다. 또한 특정 뷰 컨트롤러의 인스턴스를 참조하는 것이 쉽지 않다고.. 허허 그랬군요.. 삽질 재밌었다 ^^

 

반면 AppDelegate 클래스는 어디서든 쉽게 접근할 수 있도록 참조 경로가 제공되는 객체이고, 정의된 변수를 뷰 컨트롤러가 참조하기도 쉽다고 한다. 또한 앱 딜리게이트 객체는 앱이 생성될 때 함께 생성되었다가, 앱이 소멸할 때 함께 소멸되기 때문에 여기 저장해두면 앱이 종료되기 전까지는 데이터의 유실을 걱정하지 않아도 된다는 것. 

 

하지만 이 또한 메모리에 저장하는 방법이기 때문에 앱이 종료되면 저장된 데이터들이 함께 소멸된다는 문제가 있기에, 추후 데이터 저장에 대해 더 깊게 공부하여 데이터의 영구 보존을 위해 더 다양한 방법을 익혀야지..!

 

AppDelegate 에 데이터를 저장해서 불러오는 법

1. AppDelegate 클래스에 데이터를 저장할 배열 변수를 선언한다. 

class AppDelegate: UIResponder, UIApplicationDelegate {
    var itemList: [String] = []
}

2. save 버튼 터치 시 AppDelegate 객체를 참조하여 리스트에 입력값을 저장한다. 

@objc func save(_ sender: Any) {
    ...
    let data = inputText.text 
    let appDelegate = UIApplication.shared.delegate as! AppDelegat
    appDelegate.itemList.append(data)
    ...
}

3. 테이블 뷰 DataSource에도 AppDelegate를 참조한 값들을 넣어주고, 이렇게 저장된 값들을 viewWillAppear(_:) 메소드에서 테이블뷰에 띄워준다. 

override func viewWillAppear(_ animated: Bool) {
    self.tableView.reloadData()
}

 

728x90
반응형