请查看下面的segue代码。有两个控制器。第一个控制器是一个具有变量“activeRow”的tableview,它是一个标识所选indexPath行的整数。然后,通过segue将变量“activeRow”传递给第二个视图控制器,该控制器具有显示所选indexPath行的标签。没什么复杂的。当我运行代码时,无论索引路径如何,第二个视图控制器上的标签始终显示“0”。 “0”是变量“activeRow”的初始值。但是,我在代码中插入的打印函数(见下文)显示“activeRow”的值正在根据tableview的所选indexPath行进行更改。值得注意的是:当我运行模拟器时,控制台会打印两次“segue function:”。例如,如果indexPath值为1,则将以下内容打印到控制台:“segue function:0”和“segue function:1”
无论如何,“activeRow”的值不会通过segue传递。
但是,如果我从secondViewController.labelTxt中删除“activeRow”变量并简单地给它一个字符串值:secondViewController.labelTxt =“Test”,那么字符串“Test”将传递给第二个视图控制器并通过标签显示。
有什么想法吗?
示例代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
activeRow = indexPath.row
print("This is the active row selected: \(indexPath.row)")
performSegue(withIdentifier:"sendToDetailView", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "sendToDetailView" {
let secondViewController = segue.destination as! DetailViewController
secondViewController.labelTxt = String(activeRow)
print("segue function: \(secondViewController.labelTxt)")
}
第二视图控制器代码
import UIKit
class DetailViewController: UIViewController {
var labelTxt = ""
//var activeRow = 0
@IBOutlet var testLable: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
testLable.text = labelTxt
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 0 :(得分:1)
将indexPath
作为segue发件人传递,以便将其传递给segue准备中的DetailViewController
。当控制器通过didSet
时,将执行indexPath
块。
未在prepare(for segue:
中加载出口,因此通过在switch语句中使用目标的视图,我们将自动展开该值并加载视图。
<强> MasterViewController.swift 强>
// MARK: UITableViewDelegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier:"sendToDetailView", sender: indexPath)
}
// MARK: Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch (segue.destination.view, segue.destination, sender) {
case let (_, controller as DetailViewController, indexPath as NSIndexPath):
controller.indexPath = indexPath
break
default:
break
}
}
<强> DetailViewController 强>
// MARK: Outlets
@IBOutlet var testLabel: UILabel?
// MARK: Properties
var indexPath: NSIndexPath? {
didSet {
testLabel?.text = indexPath?.row.description
}
}