在我单击单元格之后,我可以通过2个视图,该如何解决?

时间:2019-06-05 23:42:34

标签: swift xcode uinavigationcontroller uitabbarcontroller

我有一个应用程序,该应用程序以3个项目的标签栏开头,其中2个只是常规视图控制器,其中之一是导航控制器,而在他是表格视图之后,当我单击要传递的单元格时2字符串到标签并传递到新的视图控制器以显示标签的,我的问题是,在单击单元格后,它看起来像是跳转2视图控制器的,直到我想要的视图控制器为止,而第一次只有在我按下返回表视图控制器之后(这里我需要从2个视图控制器返回给他),才能看到我传递的数据,请帮助我修复代码,我想传递数据并移到新的视图控制器,当我想回到表格视图时,我只需要单击即可

// Table View Controller,在他之前,我有一个导航控制器

// segue的标识符是“ Details”

import UIKit

class HistoryTableViewController: 
UIViewController,UITableViewDelegate,UITableViewDataSource {


@IBOutlet weak var historyTableView: UITableView!
var historyArray = [history]()
var foods = ["Milk","Honey","Salt","Bread","Banana"]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return foods.count
    //historyArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = historyTableView.dequeueReusableCell(withIdentifier: "cell") as? HistoryCellViewController
        else {return UITableViewCell()}

    //  cell.ageLabel.text = String(format:"%f", historyArray[indexPath.row].age)
    //  cell.genderLabel.text = historyArray[indexPath.row].gender
    // cell.ageLabel.text = String(format:"%f", 23)
    cell.genderLabel.text = foods[indexPath.row]
    cell.ageLabel.text = foods[indexPath.row]
    // cell.genderLabel.text = "Bar"
    //cell.historyImage.image = nil
    return cell

}

var selectedAge:String = " "
var selectedGender:String = " "
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    selectedAge = self.foods[indexPath.row]
    selectedGender = self.foods[indexPath.row]
    performSegue(withIdentifier: "Details", sender: self)


}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Details"{
        let vc = segue.destination as! HistoryDetailsViewController
        vc.age = selectedAge
        vc.gender = selectedGender
    }
}


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete {

        foods.remove(at: indexPath.row)
        historyTableView.reloadData()
    }

}
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

}

我要在单元格上单击后传递的

// view控制器

 import UIKit

 class HistoryDetailsViewController: UIViewController {
 @IBOutlet weak var ageLabel: UILabel!
 @IBOutlet weak var genderLabel: UILabel!
 var age:String?
 var gender:String?
 override func viewDidLoad() {
    super.viewDidLoad()
      ageLabel.text = self.age
      genderLabel.text = self.gender
    // Do any additional setup after loading the view.
}

 //
 //    @IBAction func Back(_ sender: UIBarButtonItem) {
 //        
//      //  self.tabBarController?.selectedIndex = 0
//    }



}

1 个答案:

答案 0 :(得分:0)

首先,在tableView(_:cellForRowAt:)中,您是typecastingdequeued cell的人。

我的问题是-HistoryCellViewController中的type是什么?是HistoryCellViewController还是其他?如果它是UITableViewCell,则必须将其重命名为更相关的名称,例如UITableViewCell。这有点令人困惑。

方法1:

现在要解决您面临的实际问题。与其尝试使用HistoryCell,不如尝试手动推segue

HistoryDetailsViewController

不需要额外的变量-func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let controller = self.storyboard?.instantiateViewController(withIdentifier: "HistoryDetailsViewController") as? HistoryDetailsViewController { controller.age = self.foods[indexPath.row] controller.gender = self.foods[indexPath.row] self.navigationController?.pushViewController(controller, animated: true) } } selectedAge

方法2:

如果您想使用selectedGender本身来执行此操作,则不要在segue中调用performSegue(withIdentifier:sender:),即删除下面的代码行,

tableView(_:didSelectRowAt:)

这是因为performSegue(withIdentifier: "Details", sender: self) 被执行两次-一次通过"Details" segue,另一次通过上述代码行。