执行 segue 后无法更改标签文本



我有一个主视图控制器,它将字符串发送到第二个视图控制器中,如下所示:

if segue.identifier == "statsSegue" {
let recievingVC:StatisticsVC = segue.destination as! StatisticsVC
var recievingview:StatisticsView
for View in recievingVC.view.subviews {
if View is StatisticsView {
recievingview = View as! StatisticsView
recievingview.setLabel(data: "673")
}
}
}

当 segue 发生时,标签正确显示为 673。但是,在第二个视图控制器中,如果我尝试执行类似的 setLabel,它不会更改显示的标签:

override func viewDidLoad() {
super.viewDidLoad()
let potato:StatisticsView = self.view.subviews[0] as! StatisticsView
potato.GamesWonNum.text = String(580)

忽略土豆变量,它是一个占位符。SetLabel()上面第一个片段中只是调用GamesWonNum.text

那么,为什么标签在 segue 中正确更改,但在我正在进入的 viewController 的viewDidLoad方法中没有更改?

谢谢

因为您正在访问recievingVC的视图,这意味着viewDidLoad()将被调用(因此名称视图确实加载了)。调用viewDidLoad()后,再次将标签更改为 673。要解决此问题,您可以更改viewWillAppear()中的文本。

class StatisticsVC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let potato = view.subviews[0] as! StatisticsView // You should just have "potato" as a property
potato.GamesWonNum.text = "580"                  // GamesWonNum should be called "gamesWonNum"
}
}
class TestViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "statsSegue" {
segue.destination.view.subviews.forEach { ($0 as? StatisticsView)?.setLabel(data: "673") }
}
}
}

您不应尝试操作其他视图控制器的视图层次结构。这违反了封装原则,这是一个重要的OO概念。相反,应将属性添加到用于传递要显示的信息的目标视图控制器,并在目标视图控制器的 viewDidLoad 或 viewWillAppear 中安装数据。

此外,对视图控制器进行硬编码以期望在其子视图中的固定索引处具有特定视图也是一个坏主意。这是脆弱的。如果以后重构视图层次结构,该代码将中断。相反,您应该创建一个插座或将其链接起来,或者在视图上设置一个标签,然后使用该标签来查找所需的子视图。

最新更新