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()
}
'Project > ToyProject_Couple App' 카테고리의 다른 글
[Swift iOS] tableView 안에 Date Picker 넣는 법? (0) | 2021.03.14 |
---|---|
[Swift iOS] UIAlertController로 alert 창 띄우기 (0) | 2021.03.13 |
[Swift iOS] Custom UITableView 만들기 (0) | 2021.03.12 |
[Swift iOS] modal presentation style 모달로 화면 띄우기 (0) | 2021.03.11 |
[Swift iOS] UIImagePickerController로 사진첩에서 사진 가져오기 (0) | 2021.03.11 |