我有一个主ViewController,它将String发送到第二个视图控制器,如下所示:
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.但是,在第二个ViewController中,如果我尝试执行类似的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
方法中没有改变?
由于
答案 0 :(得分:1)
因为您正在访问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") }
}
}
}
答案 1 :(得分:0)
您不应该尝试操纵另一个视图控制器的视图层次结构。这违反了封装原则,这是一个重要的OO概念。相反,您应该向目标视图控制器添加用于传递要显示的信息的属性,并在目标视图控制器的viewDidLoad或viewWillAppear中安装数据。
此外,对视图控制器进行硬编码以期望其子视图中的固定索引处的特定视图是个坏主意。那很脆弱。如果您稍后重新构建视图层次结构,那么代码将会中断。相反,您应该创建一个插座或将其链接起来,或者在视图上设置标签并使用该标签来查找所需的子视图。