enter image description hereenter image description hereSo yeah, I don't really like asking questions here as a beginner because many of you are pretty rough, even rude with people like me just starting out, but I want to learn so I will suck it up.

我想知道是否有方法可以减少下面的重复代码(清理它)?

我知道我的要求很多,下面有很多代码,我只是渴望学习.

谢谢你的帮助. 请谅解!

    UserDefaults.st和ard.set(machineODInputText.text, forKey: "TBMOD")
    UserDefaults.st和ard.set(pipeODInputText.text, forKey: "pipeOD")
    UserDefaults.st和ard.set(muckUpInputText.text, forKey: "muckUp")
    UserDefaults.st和ard.set(jackingSpeedInputText.text, forKey: "speed")
    UserDefaults.st和ard.set(pipeLengthInputText.text, forKey: "pipeLength")
    UserDefaults.st和ard.set(driveLengthInputText.text, forKey: "driveLength")
    UserDefaults.st和ard.set(noOfBenoBagsInputText.text, forKey: "noOfBenoBags")
    UserDefaults.st和ard.set(weightOfBenoBagInputText.text, forKey: "weightOfBenoBag")
    UserDefaults.st和ard.set(benoQtyForTanksInputText.text, forKey: "benoQtyForTanks")
    UserDefaults.st和ard.set(noOfBenoBagsPerPalletInputText.text, forKey: "benoBagsPerPallet")

    machineODInputText.inputAccessoryView = toolBar()
    pipeODInputText.inputAccessoryView = toolBar()
    pipeLengthInputText.inputAccessoryView = toolBar()
    driveLengthInputText.inputAccessoryView = toolBar()
    muckUpInputText.inputAccessoryView = toolBar()
    jackingSpeedInputText.inputAccessoryView = toolBar()
    weightOfBenoBagInputText.inputAccessoryView = toolBar()
    noOfBenoBagsInputText.inputAccessoryView = toolBar()
    benoQtyForTanksInputText.inputAccessoryView = toolBar()
    noOfBenoBagsPerPalletInputText.inputAccessoryView = toolBar()

    machineODInputText.clearsOnBeginEditing = true
    pipeODInputText.clearsOnBeginEditing = true
    pipeLengthInputText.clearsOnBeginEditing = true
    driveLengthInputText.clearsOnBeginEditing = true
    muckUpInputText.clearsOnBeginEditing = true
    jackingSpeedInputText.clearsOnBeginEditing = true
    weightOfBenoBagInputText.clearsOnBeginEditing = true
    noOfBenoBagsInputText.clearsOnBeginEditing = true
    benoQtyForTanksInputText.clearsOnBeginEditing = true
    noOfBenoBagsPerPalletInputText.clearsOnBeginEditing = true

和 finally

    override func viewDidAppear(_ animated: Bool) {
    if let a = UserDefaults.st和ard.object(forKey: "TBMOD") as? String {
        machineODInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "pipeOD") as? String {
        pipeODInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "muckUp") as? String {
        muckUpInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "speed") as? String {
        jackingSpeedInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "pipeLength") as? String {
        pipeLengthInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "driveLength") as? String {
        driveLengthInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "noOfBenoBags") as? String {
        noOfBenoBagsInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "weightOfBenoBag") as? String {
        weightOfBenoBagInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "benoQtyForTanks") as? String {
        benoQtyForTanksInputText.text = a
    }
    
    if let a = UserDefaults.st和ard.object(forKey: "benoBagsPerPallet") as? String {
        noOfBenoBagsPerPalletInputText.text = a
    }

推荐答案

在这种情况下,我认为减少代码重复的一个好方法是创建一个定制的UITextField子类,因为您正在做的许多"重复"的事情都是在文本字段中完成的,并且实际上只是对它们进行初始化.

我会像这样创建一个子类:

@IBDesignable
// you can definitely come up with a better name than I do...
class BentoniteInputField: UITextField {
    @IBInspectable
    var userDefaultKey: String = ""
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    func commonInit() {
        inputAccessoryView = toolBar()
        clearsOnBeginEditing = true
        if let text = UserDefaults.standard.string(forKey: userDefaultKey) {
            self.text = text
        }
    }
    
    func toolBar() -> UIView {
        // move the toolBar method here...
    }

    func writeToUserDefaults() {
        UserDefaults.standard.set(text, forKey: userDefaultKey)
    }
}

在情节提要中,您可以将文本字段的类设置为此类:

enter image description here

然后,您还可以为情节提要中的文本字段设置关联的用户默认键:

enter image description here

还要记住改变@IBOutlet的型号!

现在,我们只剩下写入用户默认设置的代码.您可以通过将所有文本字段放入一个数组并循环该数组来减少该部分的重复性:

let textFields = [
    machineODInputText,
    pipeODInputText,
    // ... list all the text fields
]

for textField in textFields {
    textField.writeToUserDefaults()
}

尽管就我个人而言,我不会介意 for each 文本字段重复writeToUserDefaults()次.

Swift相关问答推荐

Swift Tree实现中的弱var

如何消除SwiftUI中SF符号的填充

如何将图像插入到矩形中

插入/删除视图时的Swiftui动态过渡

从Firebase播放音频文件不起作用

仅当单击UIButton时才调用计时器函数

从任务中打印

为什么 Swift URL 的 init?(string: String,relativeTo: URL?) 仅添加协议?

覆盖一个子元素的 HStack 对齐方式

从 iPhone 中的安全飞地获取真正的随机数?

Swift-SceneKit-无法从art.scnassets加载.scn文件

在 Swift 中增量写入大型文本文件的最佳方法

动画偏移正在 destruct 按钮 SwiftUI

为什么 SwiftUI 不在工具栏菜单中反映 @State 属性值?

如何在 SwiftUI 中将图像传递到 2 个视图

Swift Components.Url 返回错误的 URL

将项目引用添加到 Swift iOS XCode 项目并调试

应用程序包不包含有效标识符

Swift performSegueWithIdentifier 不起作用

如何快速格式化用户显示(社交网络等)的时间间隔?