繁体   English   中英

协议功能将值发送回第一个VC,但未将其设置为变量

[英]Protocol function sends the value back to the first VC but does not set it to the variables

我正在学习IOS,我有三个视图控制器A,B和C,我可以从B和B从A访问C,然后使用此委托方法将数据从C发送回A,然后我要使用这些接收到的数据在A中,最后更新VC A的textView中的文本,但是它始终使用默认值而不是接收到的默认值来更新textView。

A级

protocol isAbleToReceiveData{
    func pass(book: String, chapter: Int)
}

class AViewController: UIViewController, isAbleToReceiveData{

    var verses: [DBTVerse] = []
    var text: String = ""
    var currentBook: String = "Test"
    var currentChapter: Int = 1

    @IBOutlet weak var TextView: UITextView!

    func pass(book: String, chapter: Int) {
        self.currentBook = book
        self.currentChapter = chapter
        print(currentBook, currentChapter)
        // current output is ok "the received data"
        }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        getVerses(book: self.currentBook, Chapter: NSNumber(value: self.currentChapter))

        print(currentBook, currentChapter)
        // current output "test" "1" while it should be the received data
    }

    func data(verses: [DBTVerse]) {
        for verse in verses{
            if let chapter: Int = verse.verseId?.intValue{
            text.append(String(chapter))
            text.append(verse.verseText)
            }
        }
        updateData(text: text)
    }

    func updateData(text: String){
        if let textView = self.versesTextView {
        textView.text = text
        textView.setNeedsDisplay()
        }
    }    

    func getVerses(book: String, Chapter: NSNumber) {
        DBT.getTextVerse(withDamId: "ARBWTCO1ET", book: book, chapter: Chapter, verseStart: nil, verseEnd: nil, success: { (verse) in
            if let verse = verse {
                    self.verses = verse as! [DBTVerse]
                    self.data(verses: self.verses)
            }
        }) { (error) in
            if let error = error {
                print("Error \(error)")
            }
        }
    }
}

C级

class CTableViewController: UITableViewController {

    var currentBook: String = ""
    var chapters: [DBTChapter] = []
    var AVC = AViewController()
    var delegate: isAbleToReceiveData?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = AVC
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let selectedChapter = Int(chapters[indexPath.row].chapterId) {
            doDismiss(book: currentBook, chapter: selectedChapter)
        }
    }

    func doDismiss(book: String, chapter: Int) {
        if let delegate = self.delegate{
            delegate.pass(book: book, chapter: chapter)
        }
        // Use presentingViewController twice to go back two levels and call
        // dismissViewController to dismiss both viewControllers.
        self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
    }

因此,通常A会接收数据,但不会将其覆盖到变量中,因此我可以稍后或在viewWillAppear中使用它。

您必须告诉下一个Viewcontroller是谁的委托,就像这样,如果您在A VC中并且B进行了选择,则添加一个viewController

class AViewController: UIViewController, isAbleToReceiveData{
   //all class details
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToClassB"{
        let vc = segue.destination as! bViewController
        vc.delegate = self
    }
}

在B类中,您有一个新属性,例如c

class b: UIVIewcontroller{
var delegate: isAbleToReceiveData?

因此,在要连接到下一个viewController c VC的func中,添加此func

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToClassC"{
        let vc = segue.destination as! CTableViewController
        vc.delegate = self.delegate
    }
}

暂无
暂无

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

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