如何解决使用协议和委托将数据传回数据模型文件
[已解决] 作为初学者,这很可能不是最佳或聪明的解决方案,但它可以完成它需要做的事情。来自 AddVocabViewController 的数据通过此委托传回,然后将新的 Vocab 实例插入到数据模型的数组中。准备segue函数中的委托也允许数据通过。
class ViewController: UIViewController,passNewWordData{
func passDataBack(data: Vocab){
vocabBuilder.n1LevelVocab.insert(data,at: vocabBuilder.n1LevelVocab.startIndex)
self.dismiss(animated: true) {
let currentVocabNumber = vocabNumber
self.vocabBuilder.n1LevelVocab.swapAt(currentVocabNumber,self.vocabBuilder.n1LevelVocab.startIndex)
self.loadUIN1()
print(vocabNumber)
}
}
原问题如下:
我有一个类模态视图控制器可以成功传回数据,但我想将此数据类型插入到数组中。
我的模态视图控制器是这样的:
import UIKit
protocol passNewWordData {
func passDataBack(data: Vocab)
}
//pass back the data using this protocol and calling it as a delegate
var vocabBuilder1 = VocabBuilder()
class AddVocabularyViewController: UIViewController {
@IBOutlet var modalView: UIView!
@IBOutlet weak var vocabTextField: UITextField!
@IBOutlet weak var hiraganaTextField: UITextField!
@IBOutlet weak var englishTranslationTextField: UITextField!
var delegate: passNewWordData?
//this is crucial! This is the link between both VCs.
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addNewWord(_ sender: UIButton) {
guard let vocabText = vocabTextField.text,vocabTextField.hasText else {
print("Error no data")
let ac = UIAlertController(title: "Missing Vocabulary Word!",message: "Please fill in the Vocabulary field",preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK",style: .cancel))
present(ac,animated: true)
return
}
guard let hiraganaText = hiraganaTextField.text,hiraganaTextField.hasText else {
print("Error no hiragana entered")
let ac = UIAlertController(title: "Missing hiragana!",message: "Please fill in the Hiragana field",animated: true)
return
}
guard let englishTranslationText = englishTranslationTextField.text,englishTranslationTextField.hasText else {
let ac = UIAlertController(title: "Missing English Translation!",message: "Please fill in the English Translation field",animated: true)
print("Error no english translation entered.")
return
}
//better to have guard lets to handle the data so conditions are correct before passing the data..
let newWord = Vocab(vocabTitle: vocabText,vocabHiragana: hiraganaText,englishTranslation: englishTranslationText,noOfTimesSeen: 0)
delegate?.passDataBack(data: newWord)
print(newWord)
}
这会打印出被发回的数据没问题,但我想要做的是将此数据添加到我专门为其中的数组制作的数据模型文件中。
struct VocabBuilder {
var n1LevelVocab = [Vocab(vocabTitle: "上達",vocabHiragana: "じょうたつ",englishTranslation: "Improvement",noOfTimesSeen: 0),Vocab(vocabTitle: "乗り越える",vocabHiragana: "のりこえる",englishTranslation: "To Push Through",Vocab(vocabTitle: "耐久性",vocabHiragana: "たいきゅうせい",englishTranslation: "Durability",]
我尝试过的事情:
我尝试对主视图控制器进行扩展以接收数据,但是当我从数据模型调用函数以添加它们时,它不会附加数据。
extension ViewController: passNewWordData {
func passDataBack(data: Vocab) {
self.dismiss(animated: true)
self.vocabInfo.n1LevelVocab.append(data)
//vocabInfo is calling the VocabBuilder Struct.
//need to append this data to the newWord variable then send that back to the n1VocabArray in the dataModel.
print(data)
}
}
我在数据模型中进行了测试,附加了一个新的 Vocab 类型,它确实向那里的数组附加了一个额外的项目,但是我如何从我的模态视图控制器中获取该数据一直返回到该结构?我是否需要创建一个扩展来处理来自我的数据模型本身的协议的数据?大多数示例只是直接传递到视图控制器。 任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。