Ios Swift didSelectRowAt将数组值传递给第二个视图

Ios Swift didSelectRowAt将数组值传递给第二个视图,ios,swift,uitableview,segue,Ios,Swift,Uitableview,Segue,我正在寻找解决将数据从第一个视图控制器转换到第二个视图控制器的问题的方法。当用户选择表格单元格时,将调用第二个视图控制器 填充第一个tableview的代码 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = mtgRates.dequeueReusableCell(withIdentifier: "cel

我正在寻找解决将数据从第一个视图控制器转换到第二个视图控制器的问题的方法。当用户选择表格单元格时,将调用第二个视图控制器

填充第一个tableview的代码

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = mtgRates.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

    cell.fiName.text = fetchedFiName[indexPath.row].fiName
    cell.oneYear.text = fetchedFiName[indexPath.row].oneYear
    cell.twoYear.text = fetchedFiName[indexPath.row].twoYear
    cell.threeYear.text = fetchedFiName[indexPath.row].threeYear
    cell.fourYear.text = fetchedFiName[indexPath.row].fourYear
    cell.fiveYear.text = fetchedFiName[indexPath.row].fiveYear


            return (cell)

}
我看过很多youtube视频,但在使用数组集全局设置数据时,它们都采用了简单的方法

代码,我一直在工作,但在这一点上什么也不做

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        oneYearFound = self.fetchedFiName[indexPath.row].oneYear
        twoYearFound = self.fetchedFiName[indexPath.row].twoYear
        threeYearFound = self.fetchedFiName[indexPath.row].threeYear
        fourYearFound = self.fetchedFiName[indexPath.row].fourYear
        fiveYearFound = self.fetchedFiName[indexPath.row].fiveYear

    performSegue(withIdentifier: "segue", sender: self)



}
我认为我的问题是将获取的结果发送到第二个视图控制器

谢谢你的帮助


更多信息基于回复。你是对的,我在故事板上有两个视图控制器。到目前为止,我的UIViewController的代码是

class SegueViewController: UIViewController {

@IBOutlet weak var V2TwoYear: UILabel!
@IBOutlet weak var V2FiveYear: UILabel!
@IBOutlet weak var V2FourYear: UILabel!
@IBOutlet weak var V2ThreeYear: UILabel!
@IBOutlet weak var V2OneYear: UILabel!
@IBOutlet weak var V2FiName: UILabel!

override func viewDidLoad() {

    super.viewDidLoad()

    V2FiName.text = foundFi[myIndex].fiName
    V2TwoYear.text = foundFi[myIndex].twoYear
    V2OneYear.text = foundFi[myIndex].oneYear
    V2ThreeYear.text = foundFi[myIndex].threeYear
    V2FourYear.text = foundFi[myIndex].fourYear
    V2FiName.text = foundFi[myIndex].fiveYear

}

我需要做一些假设:

  • 您有一个序列号为“seque”的故事板
  • 在该序列的末尾有一个视图控制器
  • 你需要发一封信给我。。。。所有这5个值都将传递给SecondViewController。假设视图控制器有5个UILabel,显示您要发送的五个值
  • 听起来SecondViewController需要某种对象来保存这些值。在该视图控制器上定义一个,然后在FirstViewController上创建prepareForSeque方法

    在prepareForSeque中,将目标视图控制器从序列中取出,然后将其传递给对象

    然后使用该对象填充ViewDidDisplay或ViewDidLoad中标签的值

    编辑:

    看起来你真的很接近。确保不要忘记在第一个视图控制器中包含PrepareForsque方法。在该方法覆盖中,您可以访问第二个视图控制器实例并设置这些数组值

    这里有一些代码可以帮助您思考

    class LabelsClass {
      var str1:String;
      var str2:String;
    
      init(firstName:String, secondName:String) {
        str1 = firstName;
        str2 = secondName;
      }
    }
    
    class SegueViewController: UIViewController {
      var firstLabelString:String = ""
      var secondLabelString:String = ""
    
    
      func setValues(labels:LabelsClass) {
        self.firstLabelString = labels.str1;
        self.secondLabelString = labels.str2;
      }
    }
    
    
    class MessageListViewController: UIViewController {
    
    
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        var first = "Game"
        var second = "maniac"
    
        var localLabelsVar = LabelsClass.init(firstName: first,secondName: second);
    
        var destVC = segue.destination as? SegueViewController
        destVC?.setValues(labels: localLobalsVar)
      }
    
    }
    
    资料来源:


    为什么不传递fetchedFiName的实例

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedFiName = self.fetchedFiName[indexPath.row]
            performSegue(withIdentifier: "segue", sender: selectedFiName)
    }
    
    然后,将您的发件人强制转换为您的\u FETCHED\u FI\u NAME\u CLASS,并在PrepareForegue中将其传递给您的目标视图控制器:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if let selectedFiName = sender as? YOUR_FETCHED_FI_NAME_CLASS,
            destVC = segue.destination as? SegueViewController {
            destVC.passedFiName = selectedFiName
        }
      }
    
    然后,在目标viewController和ViewDidLoad之后(因为在此之前不会加载标签),您可以使用
    passedFiName
    填充标签

    override func viewDidLoad() {
        super.viewDidLoad()
        updateLabels()
    }
    
    func updateLabels() {
        V2FiName.text = passedFiName.fiName
        V2TwoYear.text = passedFiName.twoYear
        V2OneYear.text = passedFiName.oneYear
        V2ThreeYear.text = passedFiName.threeYear
        V2FourYear.text = passedFiName.fourYear
        V2FiName.text = passedFiName.fiveYear
    }
    
    更新:

    我仍然有这个问题。我想我越来越近了

    控制器1代码

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
        let selectedFiName = self.fetchedFiName[indexPath.row].fiName
        let selectedOneYear = self.fetchedFiName[indexPath.row].oneYear
        let selectedTwoYear = self.fetchedFiName[indexPath.row].twoYear
        let selectedThreeYear = self.fetchedFiName[indexPath.row].threeYear
        let selectedFourYear = self.fetchedFiName[indexPath.row].fourYear
        let selectedFiveYear = self.fetchedFiName[indexPath.row].fiveYear
    
        passData = [SecondTable(passedFIName: selectedFiName, passedOneYear: selectedOneYear, passedTwoYear: selectedTwoYear, passedThreeYear: selectedThreeYear, passedFourYear: selectedFourYear, passedFiveYear: selectedFiveYear)]
    
    
       performSegue(withIdentifier: "SecondViewController", sender: self)
    
    
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if let selectedFiName = sender as!  ,
            let destVC = segue.destination as? SecondViewController {
            destVC.fiName = selectedFiName
        }
    }
    
    第二视图控制器代码`

    struct SecondTable {
    
    var passedFIName: String = ""
    var passedOneYear: String = ""
    var passedTwoYear: String = ""
    var passedThreeYear: String = ""
    var passedFourYear: String = ""
    var passedFiveYear: String = ""
    
    }

    类SecondViewController:UIViewController{

    @IBOutlet weak var fiName: UILabel!
    @IBOutlet weak var sometext: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let fiDetails = SecondTable()
    
        fiName.text = .passedFIName
        sometext.text = "Some Text"
    
    
    }
    
    }

    我在“override func prepare”处收到错误消息(对于segue:UIStoryboardSegue,发送方:Any?){ 我不知道在“发件人”后面加什么作为“缺少值”


    我已经搜索了几个小时。我解决了这个问题。我的项目将开始进行。谢谢你的帮助!`

    请描述foundFi和myIndex的定义和分配位置。我几天前根据帖子移动了这种方法。我昨晚发布了更新的代码。我在上面的帖子中添加了一些代码来说明这个问题除此之外,我正在尝试解释。通过一些更改,您应该能够理解如何对代码执行相同的操作。谢谢。我对此非常陌生。我需要确认每组代码应放置在何处。您可能需要创建一个新文件来保存labels对象。然后,第一个和segue视图控制器将放在它们自己的类中。我结尾不是全部答案,但你可以学习并适应它。我不知道我应该在这里放什么你的\u FETCHED\u FI\u NAME\u类。我有一个错误“SequeViewController没有成员passedFiName。请注意,附加到我的第二个视图控制器的类是SegueViewController。第一个视图控制器称为ViewController您正在将
    发送方
    强制转换到您的
    foundFi[myIndex]的类
    。包含属性fiName的一年、两年、三年、四年、五年