번거로운 Delegate 를 사용하지 않고도 안전하게 이전 뷰컨트롤러로 데이터를 전송하는 법을 알아보도록 하겠읍니다.
먼저 데이터를 받을 테이블뷰컨트롤러를 생성하고 뿌려줄 데이터를 저장할 어레이를 만들어줍니다.
let disposeBag = DisposeBag()
let stringArray = Variable<[String]>([])
let tableView = UITableView()
이후 스트링어레이와 테이블뷰를 바인딩해줍니다.
stringArray.asObservable().bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)){
row, data, cell in
cell.textLabel?.text = data
}.disposed(by: disposeBag)
1차적인 작업이 끝났으니, 입력창으로 넘어갑니다. 이 뷰컨트롤러는 NextViewController 로 설정해줍니다.
데이터를 입력할 텍스트필드와 Observable 을 설정해줍니다. 최근 값만 확인할 것이기 때문에 PublishSubject 로 설정하겠읍니다.
let scTextField = UITextField()
let observeText = PublishSubject<String>()
let backBtn = UIButton()
var sendString = ""
뒤로 이동할 버튼과, 버튼 이동 시에 전달할 변수도 지정해 줍니다.
@objc func backTouched() {
self.navigationController?.popViewController(animated: true)
self.sendString = scTextField.text ?? ""
observeText.onNext(sendString)
}
뒤로 넘어갈 때 scTextField에 있는 값을 observeText 에 추가해줍니다.
이제 NextViewController 에서 할 일은 모두 완료되었습니다.
다시 최초 뷰컨트롤러로 돌아갑니다.
NextViewController 로 이동할때 버튼 액션을 설정합니다.
let vc = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
vc.observeText.asObservable().filter({!(($0.isEmpty))}).distinctUntilChanged({$0 == $1}).debounce(1, scheduler: MainScheduler.instance).subscribe(onNext: { (text) in
self.stringArray.value.append(text)
print(self.stringArray.value)
}, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
self.navigationController?.pushViewController(vc, animated: true)
filter 옵션으로 공백은 포함되지 않으며, distinctUntilChanged 로 동일한 명칭은 제외하고 구독을 하게 설정하였읍니다.
다음 뷰로 넘어가는 버튼에 해당 함수를 추가하였기 때문에, 버튼을 누르면서 구독이 시작되며 다음 뷰에서 일어나는 현상을 관찰합니다.
그리고 NextViewController 에서 뒤로가기 버튼을 누르면, sendString 값을 observeText 의 구독값으로 설정하고, 변화를 감지한 최초 뷰컨트롤러에서 클로저 내의 작업을 실행하여 stringArray 에 값을 추가하게 됩니다.
'Swift 개발 이야기' 카테고리의 다른 글
API 를 여러개 호출해야할때 모든 API 가 호출되었음을 확인하려면? (0) | 2020.02.03 |
---|---|
SwiftUI를 사용하지 않고 Preview 사용하기 (0) | 2020.01.03 |
SnapKit 을 이용하여 Dynamic Height ScollView 를 만드는 법 (1) | 2019.10.10 |
RxSwift로 여러가지 Custom TableView Cell 을 설정하기 (0) | 2019.05.28 |
RxSwift 로 간단하게 텍스트의 변화 감지하기 (0) | 2018.03.09 |