Swift-方法名为

问题描述

我有一个自定义UIView,其中具有以下属性

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 (将#修改为@)