问题描述
internal lazy var usgField: UILabel = {
let usg = UILabel()
usg.font = .systemFont(ofSize: Constants.fontSize)
usg.textColor = Constants.fontColor.withAlphaComponent(Constants.alpha)
if let usgVal = Double(viewmodel.actualUpliftUSG) {
usg.text = String(Int(usgVal))
} else {
usg.text = "..."
}
return usg
}()
这是名为“ ConversionView”的类的一部分,该类继承了UIView:
import UIKit
class ConversionView: UIView {
private struct Constants {
static let mainStackSpacing: CGFloat = 5
static let valueUnitSpacing: CGFloat = 2
static let fontSize: CGFloat = 12
static let alpha: CGFloat = 0.7
static let fontColor = UIColor.i6.darkGreyWithDarkMode
}
// MARK: - Properties
private let viewmodel: CompletedOrdersviewmodel
private var company: Company?
private lazy var companyConverters: UnitInfoResponse? = {
let companyConverters = company?.companyUnitConverters ?? viewmodel.getSelectedSheet().fuelOrder.forCompany?.companyUnitConverters
return companyConverters
}()
var usgVal: String = "" {
willSet {
dispatchQueue.main.async {
self.usgField.text = newValue
}
}
}
// MARK: Stack view
internal lazy var conversionStack: UIStackView = {
let linkLabel = UILabel()
linkLabel.text = "/"
linkLabel.textColor = Constants.fontColor
linkLabel.font = .systemFont(ofSize: Constants.fontSize)
var stack = UIStackView()
if companyConverters?.Volume.displayUnit != .usg {
stack = UIStackView(arrangedSubviews: [usgStack,linkLabel,volumeStack])
} else {
stack = UIStackView(arrangedSubviews: [volumeStack])
}
stack.translatesAutoresizingMaskIntoConstraints = false
stack.axis = .horizontal
stack.spacing = Constants.mainStackSpacing
addSubview(stack)
return stack
}()
// MARK: Subviews
internal lazy var volumeStack: UIStackView = {
return createValueUnitStack(unit: companyConverters?.Volume.displayUnit?.abbreviationString ?? "",view: volume)
}()
internal lazy var usgStack: UIStackView = {
return createValueUnitStack(unit: FuelSheetStrings.field.usg.title.localized,view: usgField)
}()
internal lazy var volume: UILabel = {
let volume = UILabel()
volume.font = .systemFont(ofSize: Constants.fontSize)
volume.textColor = Constants.fontColor.withAlphaComponent(Constants.alpha)
if let volumeInLitres = Double(viewmodel.actualUpliftLT),let convertedVolume = companyConverters?.convertVolumeFromMetric(volumeInLitres) {
volume.text = String(Int(convertedVolume))
} else {
volume.text = "..."
}
return volume
}()
internal lazy var usgField: UILabel = {
let usg = UILabel()
usg.font = .systemFont(ofSize: Constants.fontSize)
usg.textColor = Constants.fontColor.withAlphaComponent(Constants.alpha)
if let usgVal = Double(viewmodel.actualUpliftUSG) {
usg.text = String(Int(usgVal))
} else {
usg.text = "..."
}
return usg
}()
private func createValueUnitStack(unit: String,view: UIView) -> UIStackView {
let unitLabel = UILabel()
unitLabel.text = unit
unitLabel.font = .systemFont(ofSize: Constants.fontSize)
unitLabel.textColor = Constants.fontColor.withAlphaComponent(Constants.alpha)
let stack = UIStackView(arrangedSubviews: [view,unitLabel])
stack.axis = .horizontal
stack.spacing = Constants.valueUnitSpacing
return stack
}
// MARK: - Initialisation
init(viewmodel: CompletedOrdersviewmodel,company: Company?) {
self.viewmodel = viewmodel
self.company = company
super.init(frame: .zero)
translatesAutoresizingMaskIntoConstraints = false
configureAutolayout()
}
required init?(coder aDecoder: NSCoder) {
fatalError("This view has no related XIB or Storyboard")
}
// MARK: - Configuration
private func configureAutolayout() {
NSLayoutConstraint.activate([
conversionStack.leadingAnchor.constraint(equalTo: leadingAnchor),conversionStack.trailingAnchor.constraint(equalTo: trailingAnchor)
])
}
}
现在,我有一个主视图,在该视图中,按如下所示初始化conversionView:
internal lazy var conversion: ConversionView = {
return ConversionView(viewmodel: viewmodel,company: company)
}()
这在我的viewController中,当我键入另一个文本字段时,我想修改在usg和volume字段中显示的文本。因此,我在vc中使用了以下textfield委托方法:
func textFieldDidChangeSelection(_ textField: UITextField) {
switch textField {
case sheet.infoView.pre.inputField:
calculaterequiredUplift()
calculatePostRefuelQuantity()
calculatediscrepancy()
case sheet.infoView.requiredDeparture.inputField:
calculaterequiredUplift()
case sheet.infoView.actualDeparture.inputField:
calculatediscrepancy()
case sheet.infoView.actual.inputField:
calculatePostRefuelQuantity()
calculateUsgAndVol(textField: textField)
default:
return
}
changeButtonStatus()
}
我感兴趣的是sheet.infoView.actual实例,然后在哪里调用此方法:
private func calculateUsgAndVol(textField: UITextField) {
if let currentText = textField.text,let currentVal = Double(currentText)
{
sheet.conversion.usgVal = String(format: "%.0f",currentVal * 1.201)
sheet.conversion.volume.text = String(currentVal * 1.455)
} else {
sheet.conversion.usgField.text = "..."
sheet.conversion.volume.text = "..."
}
}
肯定会调用委托方法,实际上,当我在计算变量usgVal上放置一个断点时,将调用willSet并接收正确的值。为什么标签文本没有变化?
我尝试使用dispatchQueue.Main.async,也可以不使用dispatchQueue.Main.async,正如您从我的方法中看到的那样,我尝试了直接(通过音量)和通过willSet来设置值。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)