繁体   English   中英

问题将数据传递回第一个视图 controller 与委托和协议(Swift)

[英]issue passing data back to first view controller with delegate and protocol (Swift)

所以我要做的是在我关闭它时将一个 String 和一个 Int 从一个 ViewController (NewCellViewController) 传递回前一个 (SecondScreenViewController)。 我在 SecondScreenViewController 的方法中添加了一个打印语句,它应该接收此数据,但它没有打印,所以我猜该方法从未运行过。 这是我的代码(删除了一些内容以仅包含相关内容):

SecondScreenViewController:

import UIKit

protocol DataDelegate {
    func insertEvent(eventString: String, pos: Int)
}
class SecondScreenViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DataDelegate {


    var eventNames = ["event1", "event2", "event3"]


    override func viewDidLoad() {
        super.viewDidLoad()
        advance()
    }
    //DataDelegate methods
    func insertEvent(eventString: String, pos: Int)
    {
        print("if this prints, it worked")
        if pos == -1
        {
            eventNames.append(eventString)
        }
        else
        {
            eventNames.insert(eventString, at: pos)
        }
    }

    @objc func advance()
    {
        let vc = NewCellViewController(nibName: "NewCellViewController", bundle: nil)
        vc.delegate = self
        present(vc, animated: true, completion: nil)
    }
}

新CellViewController:

import UIKit

class NewCellViewController: UIViewController {


var delegate:DataDelegate?

@IBOutlet var addEventName: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func addItem() {
    insertNewEvent()   
    dismiss(animated: true, completion: nil)
}
func insertNewEvent()
{
    let eventName = addEventName!.text
    delegate?.insertEvent(eventString: eventName!, pos: -1) //add different positions

}

}

我使用了与您相同的controller名称,只是为了让您更好地理解。

SecondScreenViewController

import UIKit

class SecondScreenViewController: UIViewController {

    var eventNames = ["event1", "event2", "event3"]


    override func viewDidLoad() {
        super.viewDidLoad()

        //advance()
    }

     override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        advance()
    }


    private func advance() {
        // Dont forget to add `Storyboard ID` as "NewCellViewController" on your Main.storyboard. 
        // See the image attached below.
        if let vc = self.storyboard?.instantiateViewController(identifier: "NewCellViewController") as? NewCellViewController {
            vc.delegate = self
            present(vc, animated: true)
        }
    }
}

// Better this way.
extension SecondScreenViewController: DataDelegate {
    
    func insertEvent(eventString: String, pos: Int) {
        print(eventString, pos)
    }
    
}

故事板 ID

新CellViewController

import UIKit

// Better to create protocols here.
protocol DataDelegate: class {
    func insertEvent(eventString: String, pos: Int)
}

class NewCellViewController: UIViewController {
    
    weak var delegate: DataDelegate?

    @IBOutlet var addEventName: UITextField!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    
    
    @IBAction func addItem() {
        insertNewEvent()
        dismiss(animated: true)
    }
    
    private func insertNewEvent() {
        delegate?.insertEvent(eventString: "your text", pos: -1)
        
    }
}

希望这可以帮助。

您可以尝试在第一个 VC 中使用 segue 来推送第二个 VC 并弹出第二个 VC 并返回到第一个 VC。 这可能会帮助您与委托人合作。 您还可以使用 UserDefaults 来传递和同步这些值。

根据您想要传递的具体内容,您可以使用用户默认值。 很多人不推荐,但我觉得对于简单的数据,它确实快速有效

暂无
暂无

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

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