ViewDidLoad tableViewCell alpha 问题?

问题描述

我有一个静态表格视图:

enter image description here

显示此屏幕时,我将顶部的开关设置在 viewDidLoad 中的关闭位置。我还将通过 IBOutlet 连接的 tableViewCells 设置为 0.5(不起作用),并且文本字段不响应用户交互(起作用)。当顶部的开关打开时,tableViewCells 的alpha(应该是)被恢复,并且用户交互被重新启用。这有效。当开关关闭时,单元格的 alpha 将返回到 0.5,并且文本字段用户交互再次设置为 false。这整条线都有效。基本上,开关工作完美,但 viewdidload 没有。所以,我想知道:为什么在 viewDidLoad 中设置 tableViewCells 的 alpha 不起作用?我肯定在某个地方犯了一个错误,但这似乎很简单,我无法弄清楚。相关代码如下:

@IBOutlet var switchCell1: UITableViewCell! 
@IBOutlet var theSwitch1: UISwitch! 
@IBOutlet var countryCell1: UITableViewCell! 
@IBOutlet var cityCell1: UITableViewCell! 
@IBOutlet var locationCell1: UITableViewCell! 
@IBOutlet var mainLocationTextField: UITextField!
@IBOutlet var countryTextField1: UITextField!
@IBOutlet var cityTextField1: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    

    theSwitch1.isOn = false
    
    //these three lines don't work,it is not "faded" out,if that's the right word
    countryCell1.alpha = 0.5
    cityCell1.alpha = 0.5
    locationCell1.alpha = 0.5
    //these three lines work
    countryCell1.isUserInteractionEnabled = false
    cityCell1.isUserInteractionEnabled = false
    locationCell1.isUserInteractionEnabled = false

}


//this function is connected to "theSwitch" and works perfectly
@IBAction func switch1Toggled(){
    if theSwitch1.isOn{
        countryCell1.alpha = 1.0
        cityCell1.alpha = 1.0
        locationCell1.alpha = 1.0
        countryCell1.isUserInteractionEnabled = true
        cityCell1.isUserInteractionEnabled = true
        locationCell1.isUserInteractionEnabled = true
    }else{
        countryCell1.alpha = 0.5
        cityCell1.alpha = 0.5
        locationCell1.alpha = 0.5
        countryCell1.isUserInteractionEnabled = false
        cityCell1.isUserInteractionEnabled = false
        locationCell1.isUserInteractionEnabled = false
    }
}

我真的不明白为什么在 viewDidLoad 中使用 .alpha 对我不起作用,但它在另一个函数中起作用。 顺便说一下,我还尝试在 viewDidLoad 中调用 switch1Toggled() 以便该函数设置 alpha,但由于某种原因,这也不起作用。 提前感谢您抽出宝贵时间。

解决方法

UI 元素尚未在 viewDidLoad() 中完全初始化。

您可以在 viewDidLayoutSubviews() 中设置它们的初始状态。

请注意,viewDidLayoutSubviews() 被多次调用 - 事实上,它在使用表视图时经常被调用 - 因此您需要设置一个 Bool“标志”以仅运行一次初始化:>

var firstTime: Bool = true

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    if firstTime {
        firstTime = false

        theSwitch1.isOn = false
        
        countryCell1.alpha = 0.5
        cityCell1.alpha = 0.5
        locationCell1.alpha = 0.5

        countryCell1.isUserInteractionEnabled = false
        cityCell1.isUserInteractionEnabled = false
        locationCell1.isUserInteractionEnabled = false
    }
    
}