首页 > 解决方案 > 我正在尝试使用协议和委托模式,它将我的数组中的数据传递回父视图控制器

问题描述

我是 Xcode 的新手,正在尝试将 secondViewController 中的数组保存到 View 控制器中。我在导航控制器中嵌入了一系列视图控制器,因此当我单击导航栏上的“返回”时,我想保留在数组 'collectionArray' 中收集的数据并保存到 'collectionArray2' 。这是我尝试过的协议委托方法:

这是在我的 ViewController 中,我希望将数组保存到:

import UIKit

class ViewController: UIViewController {
    
    var collectionArray2: [String] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let controller = secondViewController()
        controller.delegate = self
        
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let first = segue.destination as! secondViewController
        first.collectionArray.append(contentsOf: collectionArray2)
    }
}


extension ViewController: PopupDelegate {
    func popupSelectedView(array: [String]) {
        collectionArray2.append(contentsOf: array)
        
    }
}

这是我要使用“collectionArray”的第二个视图控制器:

import UIKit

protocol PopupDelegate: class{

    func popupSelectedView(array: [String])
}

class secondViewController: UIViewController {
    
    var exerciseButton: String!
    var collectionArray: [String] = []
    weak var delegate: PopupDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func Exercisess(_ sender: UIButton){
        exerciseButton = sender.currentTitle
        collectionArray.append(exerciseButton!)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if self.isMovingFromParent {
            delegate?.popupSelectedView(array: collectionArray)
        }
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        let second = segue.destination as! FinalViewController
        second.cellLabelArray.append(contentsOf: collectionArray)
    }
}

谢谢

标签: iosswiftxcode

解决方案


您的问题是您指的是secondViewController. 不要在 viewDidLoad 中设置您的委托,但是当您准备 segue 时:

    override func viewDidLoad() {
        super.viewDidLoad()
        //let controller = secondViewController() REMOVE THIS
        //controller.delegate = self REMOVE THIS
        
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let first = segue.destination as! secondViewController
        first.collectionArray.append(contentsOf: collectionArray2)
        first.delegate = self // set the delate here
    }
}

顺便说一句,你应该以大写字母开头命名你的所有类,所以它应该是SecondViewController


推荐阅读