如何从父UIStackView引用和修改子视图UILabel

时间:2017-03-19 21:54:23

标签: ios swift

我有一个UIStackView对象,我已将UILabel添加为第一个子视图。这是我的代码:

func createStackView() -> UIStackView? {
  var displayLabel = UILabel()
  // Set properties of displayLabel
  ...
  let myStackView = UIStackView(arrangedSubviews: [displayLabel, stackViewRow1, stackViewRow2]
  return myStackView
}

现在,我希望稍后获得对displayLabel对象的引用,以便我可以修改它的文本字段。 我能做到这一点的唯一方法就是黑客攻击:

var displayPanel = topStackView.arrangedSubviews[0]
if let displayLabel = displayPanel as? UILabel {
      displayLabel.text = "Ready"
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

如果displayLabel应该不是实例变量,那么为其设置tag值可能会有用:

  

一个整数,可用于标识您的视图对象   应用

你能做什么:

// declaring a global constant for holding the label tag value
let displayLabelTageValue = 101

func createStackView() -> UIStackView? {
    var displayLabel = UILabel()
    // setting tag
    displayLabel.tag = displayLabelTageValue
    // Set properties of displayLabel
    ...
    let myStackView = UIStackView(arrangedSubviews: [displayLabel, stackViewRow1, stackViewRow2]
        return myStackView
}

用于识别displayLabel标签:

if let displayLabel = view.viewWithTag(displayLabelTageValue) as? UILabel {
    // displayLabel is wanted label!
} else {
    // make sure that the tag value is matched
}

答案 1 :(得分:1)

在属性中存储对标签的引用:

var displayLabel: UILabel?

// then when you create the stack view
self.displayLabel = displayLabel

// to access it later
if let displayLabel = displayLabel {
    displayLabel.text = "Ready"
}

答案 2 :(得分:0)

这取决于你的目标。

如果要将堆栈视图位置0的视图文本设置为特定字符串,则发布的代码是正确的方法。

如果您有一个标签,您希望能够更改它而不管它在堆栈视图中的位置,那么您应该在视图控制器的实例变量中保存对它的引用,然后您可以设置它可以随时发送到新字符串。