![](/img/trans.png)
[英]issue passing data back to first view controller with delegate and protocol (Swift)
[英]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.