【问题标题】:Trouble passing data数据传递问题
【发布时间】:2018-12-09 02:32:46
【问题描述】:

我在通过 prepareForSegue 将数据从 MainVC 传递到 EditVC 时遇到问题。问题的要点是我正在尝试编辑已经输入的报价信息(报价和作者)(保存在 Firestore 数据库中)。当滑动(UIContextualAction)并点击编辑时,假设将数据传递给 EditVC,在那里它将引用文本和作者文本放在它们自己的 UITextView 中,它是可编辑的。编辑文本后,点击保存,它将更新 Firestore 中的条目;然后 MainVC 重新加载以更新它的视图。 EditVC 的 segue 工作完美,但它不会在各自的文本视图中显示引用和作者文本。我已经把头撞在墙上三天了,试图弄清楚。非常感谢大家的任何帮助或指导。我可以根据要求提供 Github 链接。

MainVC:

    }
        let edit = UIContextualAction(style: .normal, title: "Edit") { (action, view, nil) in
            self.performSegue(withIdentifier: "toEditQuote", sender: self.quotes)
            print("Segue initiated")
        }
        edit.backgroundColor = #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1)
        return UISwipeActionsConfiguration(actions: [delete, edit])
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        print("preparing to segue")
        if let destination = segue.destination as? EditQuoteVC {
            print("Destination = EditQuoteVC")
            if let quoteData = sender as? Quote {
                print("data passing")
                destination.quoteTxt = quoteData.quoteTxt
                destination.authorTxt = quoteData.authorTxt
                print("data passed")
            }
        }
    }
}

EditQuoteVC(目标)

class EditQuoteVC: UIViewController {

//Outlets
@IBOutlet weak var quoteText: UITextView!
@IBOutlet weak var authorText: UITextView!

//Variables
var quoteTxt: String!
var authorTxt: String!

override func viewDidLoad() {
super.viewDidLoad()
quoteText.text = quoteTxt
authorText.text = authorTxt
}

Quote.swift

class Quote {

    private(set) var quoteTxt: String!
    private(set) var authorTxt: String!
    private(set) var timestamp: Date!
    private(set) var userId: String!
    private(set) var documentID: String!


    init(quote: String, author: String, timestamp: Date, userId: String, documentID: String) {

        self.quoteTxt = quote
        self.authorTxt = "- \(author)"
        self.timestamp = timestamp
        self.userId = userId
        self.documentID = documentID
    }
    class func parseData(snapshot: QuerySnapshot?) -> [Quote] {
        var quotes = [Quote]()
        guard let snap = snapshot else { return quotes}
        for document in snap.documents { //Grabs the documents...
            let data = document.data()
            let quote = data[QUOTE_TEXT] as? String ?? ""
            let author = data[AUTHOR_TEXT] as? String ?? ""
            let timestamp = data[TIMESTAMP] as? Date ?? Date()
            let userId = data[USER_ID] as? String ?? ""
            let documentID = document.documentID

            let newQuote = Quote(quote: quote, author: author, timestamp: timestamp, userId: userId, documentID: documentID)
            quotes.append(newQuote)
        }
        return quotes
    }
}

【问题讨论】:

  • 你在 MainVC 中设置过断点吗?具体来说,如果代码被击中,您是否嵌套? quoteData 是否按预期正确填充?
  • 在您的prepareForSegue 中,您期望senderQuoteData 的一个实例,但在您的操作中,当您调用performSegue 时,您将sender 设置为nil。请在上下文中显示let edit... 代码,并提供有关如何存储报价以在表格视图中显示的详细信息;大概是QuoteData的数组
  • 另外,你为什么有QuoteData 类?看起来Quote 类已经完成了您需要的工作。
  • @dfd 我没有使用断点,只是在performSegueprepareForSegue 中打印语句。控制台显示 performSegue 正在启动,但不是 prepareForSegue。 @Paulw11 我明白你关于使用 QuoteData 类的观点。我已将其注释掉,并使用了我在上面添加的Quote 数据模型(Quote.swift)。谢谢大家的帮助。
  • 打印语句应该可以代替断点,但是您发布的代码中没有它们......因此我的“应该”。正如@GntlmnBndt 在他的回答中暗示的那样,正在发生几种可能性,包括prepareForSegue 实际上正在被处理,但其中的逻辑是错误的。 (恕我直言,toEditQuote 与您在情节提要中的名称拼写不正确。)您是否尝试过按照segue.destination 的建议更改行?

标签: ios swift


【解决方案1】:

在您的 prepareForSegue 函数中,您将目的地分配给发件人。应该是:

if let destination = segue.destination as? EditQuoteVC

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2012-11-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多