Swift 传递所选单元格';s标签文本,第一次返回nil(数据发送延迟)

Swift 传递所选单元格';s标签文本,第一次返回nil(数据发送延迟),swift,didselectrowatindexpath,Swift,Didselectrowatindexpath,我正在将所选单元格的标签文本传递给另一个视图控制器,但每次选择时它都将返回nil。之后,我返回并再次选择,我将获得上一个选定单元格的文本。为什么 var jobDateValueB:String! override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return jobTime.count //JSON Data from server }

我正在将所选单元格的标签文本传递给另一个视图控制器,但每次选择时它都将返回nil。之后,我返回并再次选择,我将获得上一个选定单元格的文本。为什么

var jobDateValueB:String!

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return jobTime.count //JSON Data from server
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath)
    let unixTimestamp = Double(jobTime[indexPath.row])
    let unixTimestamp2 = Double(jobEndTime[indexPath.row])
    let date1 = Date(timeIntervalSince1970: unixTimestamp)
    let date2 = Date(timeIntervalSince1970: unixTimestamp2)
    dateFormatter.dateFormat = "h:mm a"
    let strDate = dateFormatter.string(from: date1)
    let endDate = dateFormatter.string(from: date2)
    cell.textLabel?.text = "\(strDate) - \(endDate)"

    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showEdit"{
        let destinationB = segue.destination as? EditTimeTableVC
        destinationB?.passedDataB = jobDateValueB

    }
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "showEdit", sender: self)
    let indexPath = self.tableView.indexPathForSelectedRow;
    let currentCell = self.tableView.cellForRow(at: indexPath!) as UITableViewCell!;
    jobDateValueB = currentCell?.textLabel!.text!
}
编辑时间表

var passedDataB: String!
override func viewDidLoad() {
    super.viewDidLoad()
    print(passedDataB)
}

did中选择您正在调用的
self.performsgue
方法,然后设置
jobDateValueB
。尝试将
self.performsgue
调用移动到函数末尾

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexPath = self.tableView.indexPathForSelectedRow;
    let currentCell = self.tableView.cellForRow(at: indexPath!) as UITableViewCell!;
    jobDateValueB = currentCell?.textLabel!.text!
    self.performSegue(withIdentifier: "showEdit", sender: self)
}
这应该可以解决你的问题,但这不是推荐的方法。将所选文本值作为发送方传递,而不是将其指定给类变量。像这样

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {        
    let indexPath = self.tableView.indexPathForSelectedRow;
    let currentCell = self.tableView.cellForRow(at: indexPath!) as UITableViewCell!;
    if let value = currentCell?.textLabel?.text? {
        self.performSegue(withIdentifier: "showEdit", sender: value)
    }
}
在你的
prepare
方法中,你可以这样做

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showEdit"{
        let destinationB = segue.destination as? EditTimeTableVC
        if let selectedText = sender as? String {
            destinationB?.passedDataB = selectedText
        }
    }
}

did中选择您正在调用的
self.performsgue
方法,然后设置
jobDateValueB
。尝试将
self.performsgue
调用移动到函数末尾

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexPath = self.tableView.indexPathForSelectedRow;
    let currentCell = self.tableView.cellForRow(at: indexPath!) as UITableViewCell!;
    jobDateValueB = currentCell?.textLabel!.text!
    self.performSegue(withIdentifier: "showEdit", sender: self)
}
这应该可以解决你的问题,但这不是推荐的方法。将所选文本值作为发送方传递,而不是将其指定给类变量。像这样

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {        
    let indexPath = self.tableView.indexPathForSelectedRow;
    let currentCell = self.tableView.cellForRow(at: indexPath!) as UITableViewCell!;
    if let value = currentCell?.textLabel?.text? {
        self.performSegue(withIdentifier: "showEdit", sender: value)
    }
}
在你的
prepare
方法中,你可以这样做

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showEdit"{
        let destinationB = segue.destination as? EditTimeTableVC
        if let selectedText = sender as? String {
            destinationB?.passedDataB = selectedText
        }
    }
}