화면에서 되돌릴 때 부모 보기 화면을 업데이트하는 방법

14358 단어 SwiftiOS

목표


부모 보기 모드에서 이동된 하위 보기에서 작업을 하고 그 결과에 따라 부모 보기 내용을 업데이트하는 처리를 하지만 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.swift
class 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을 사용하는 방법이 더욱 쉬울 것 같습니다!
만약 잘못된 점이 있으면 저에게 알려주세요. 저는 매우 기쁠 것입니다.

좋은 웹페이지 즐겨찾기