【发布时间】:2016-10-30 00:53:11
【问题描述】:
请看下面的 segue 代码。有两个控制器。第一个控制器是一个表视图,它有一个变量“activeRow”,它是一个整数,用于标识选定的 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.
}
}
【问题讨论】:
-
我认为 UILabel 还没有被实例化。在 let secondViewController = 之后放一个断点,然后检查 labelTxt 变量。很确定它为零,因此无法设置文本。将其设置为第二个 VC 中的另一个变量,然后将其分配给从该变量加载的视图。
-
您在第二个视图控制器的哪个位置将
labelText放入标签中?请出示该代码 -
确保您没有直接从情节提要中的表格视图单元格链接segue。单元格的“操作”连接器应为空白
-
尝试在第一个视图控制器中初始化 var labelTxt。希望对你有帮助
-
Paulw11- 当您写下单元格的“操作”连接器应该为空白时,您是什么意思。目前,segue 从表格单元格链接到第二个视图。这是一个“推”动作。我这样做是因为触发 segue 的事件是点击 tableview 单元格。