繁体   English   中英

我正在尝试使用协议和委托模式,它将我的数组中的数据传递回父视图 controller

[英]I'm trying to use a protocol and delegate pattern which will pass the data in my array back to the parent view controller

我是 Xcode 的新手,我正在尝试将数组从 secondViewController 保存到视图 controller 中。 我在导航 controller 中嵌入了一系列视图控制器,因此当我单击导航栏上的“返回”时,我想保留在数组“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)
    }
}

谢谢

您的问题是您指的是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM