화면에서 되돌릴 때 부모 보기 화면을 업데이트하는 방법
목표
부모 보기 모드에서 이동된 하위 보기에서 작업을 하고 그 결과에 따라 부모 보기 내용을 업데이트하는 처리를 하지만 Delegate를 사용하는 것 외에 간단한 방법이 있기 때문에 쓰기로 결정했습니다!(Delegate가 아직 이해를 못해서... 웃음)
실제로
・ 상위 뷰에 CollectionView 있음
· 모드 전환 하위 뷰에 CollectionView에 표시할 정보 추가
하위 보기에서 상위 보기로 돌아갈 때, CollectionView를 포함하는 insertItems()와 애니메이션 등을 실행하고 싶습니다.
방법을 조사할 때 Delegate 양도 처리 방법을 많이 봤지만 이렇게 간단하게 처리하면 CallBack이라는 방법이 간단하다는 것을 알게 되어 소개해 드리겠습니다!
ViewController 사용
상위 세대: 컨트롤러 보기
(버튼을 누르면 모드가 하위 뷰로 이동됨)
하위 세대: ChildViewController
(단추를 누르면dismiss, 하위 보기에서 전달된 값으로 부모 보기를 실행하는 함수)
(이번에는 하위 보기에서 문자열을 전달하는 간단한 처리일 뿐)
상위 뷰
하위 뷰
뒤로 모 뷰
화면에서 되돌릴 때 부모 보기 화면을 업데이트하는 방법
하위 보기에서 부모 보기로 돌아갈 때 때때로 값을 함께 전달하고 싶기 때문에 파라미터가 있는지 없는지 소개합니다!
매개변수가 있을 때
하위 보기에서 tableView나collectionView에 표시할 값을 얻고 insertItems () 를 하려면 callBack () 의 매개 변수를 (text:String) (num:Int) 로 설정하고 reloadData () 또는 insertItems () 등의 처리를 함수에 쓰십시오!
ViewController.swift
class ViewController: UIViewController {
//生成するボタンの宣言
private lazy var button: UIButton = {
let button = UIButton(type: .system)
button.setTitle("Button", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 30)
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)
button.sizeToFit()
button.center = self.view.center
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
self.view.addSubview(button)
}
@objc func tappedButton(_ sender: UIButton) {
let childVC = ChildViewController()
//childVCにあるプロパティにクロージャを渡す
//childTextがchildVCから戻る時に渡される引数です
childVC.childCallBack = { (childText) in
self.callBack(text: childText)
}
present(childVC, animated: true, completion: nil)
}
//画面遷移から戻ってきたときに実行する関数
func callBack(text: String) {
button.setTitle(text, for: .normal)
button.sizeToFit()
button.center = self.view.center
}
}
ChildViewController.swiftclass ChildViewController: UIViewController {
//クロージャを保持するためのプロパティ
var childCallBack: ((String) -> Void)?
private lazy var childButton: UIButton = {
let childButton = UIButton(type: UIButton.ButtonType.system)
childButton.setTitle("ChiltButton", for: UIControl.State.normal)
childButton.titleLabel?.font = UIFont.systemFont(ofSize: 30)
childButton.addTarget(self, action: #selector(tappendChildButton(_:)), for: .touchUpInside)
childButton.sizeToFit()
childButton.center = self.view.center
return childButton
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.lightGray
self.view.addSubview(childButton)
}
@objc func tappendChildButton(_ sender: UIButton) {
dismiss(animated: true) {
//completionのタイミングでプロパティのクロージャを実行
//親ビューで"ボタン押したよ!"という文字列を表示したい!
self.childCallBack?("ボタン押したよ!")
}
}
}
매개 변수가 없는 엔클로저를 전달할 때
tableView나 CollectionView의 reloadData () 만 만들려면 인자가 필요하지 않기 때문에 callBack () 에서collectionView를 만듭니다.reloadData()만 쓰면 돼요!
ViewController.swift
@objc func tappedButton(_ sender: UIButton) {
let childVC = ChildViewController()
//childVCにあるプロパティにクロージャを渡す
childVC.childCallBack = { self.callBack() }
present(childVC, animated: true, completion: nil)
}
//画面遷移から戻ってきたときに実行する関数
func callBack() {
button.setTitle("子ビューでボタンが押されたよ!", for: .normal)
button.sizeToFit()
button.center = self.view.center
}
참고 보도
화면 이동에서 되돌아올 때 처리하는 방법
마지막
복잡한 처리를 원한다면 Delegate 트랜잭션을 사용하는 것이 가장 좋지만 reloadData()처럼 간단한 처리라면 CallBack을 사용하는 방법이 더욱 쉬울 것 같습니다!
만약 잘못된 점이 있으면 저에게 알려주세요. 저는 매우 기쁠 것입니다.
Reference
이 문제에 관하여(화면에서 되돌릴 때 부모 보기 화면을 업데이트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/edasan/items/bb21d95b737aa246096d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)