簡體   English   中英

如何檢查文本字段更改並將其發送到 model function? MVC / Swift 5

[英]How to check text field changes and send them to model function? MVC / Swift 5

問題是關於 MVC 的。 當用戶輸入一些文本時,我需要檢查我的文本字段更改。 Text field is in main view controller and I need to send changes to model function which is in another class in another swift file. 請告訴我如何在 MVC 中正確執行此操作的正確方法?)我應該在我的 VC 和 Model 類中使用什么?)


在 ViewController 中使用:

import UIKit

class ViewController: UIViewController {

private let reverseWords = ReverseWords()

//MARK: IBOutlets
@IBOutlet weak var reverseTextField: UITextField!
@IBOutlet weak var exeptionTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    
    //MARK: Delegation
    reverseTextField.delegate = self
    exeptionTextField.delegate = self
    
}

//I am currently using this for checking my exeptionTextField.
//But want to move it to a model.
//How can I check exeptionTextField there?
public func reverseWithIgnoringLetters() {
    
    guard let textForReverse = reverseTextField.trimmedTextNilIfEmpty,
          let textForExeption = exeptionTextField.trimmedTextNilIfEmpty else {
        resultLabel.text = ""
        return
    }
    
    resultLabel.text = "  " + textForReverse.components(separatedBy: " ").map {
        $0.reversed(omittingCharactersIn: CharacterSet(charactersIn: textForExeption)) }.joined(separator: " ")
}

@IBAction func exceptionTextFieldEditingChanged(_ sender: UITextField) {
    
    if segmentController.selectedSegmentIndex == 1 && exeptionTextField.hasText {
        reverseWithIgnoringLetters()
    } else {
        resultLabel.text = "  " + reverseWords.segmentedControlByCustom(
            textField: reverseTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines))
    }

在 model 中使用:

import UIKit
import Foundation

class ReverseWords {

public func segmentedControlByCustom(textField: String ) -> String {
    if textField.isEmpty {
        return ""
    }
    return textField.trimmingCharacters(in: .whitespacesAndNewlines)
        .components(separatedBy: " ")
        .map { String ( $0.reversed() ) }
        .joined(separator: " ")
}
}

//MARK: Exclusions extension for exepsion text field
extension String {
func reversed(omittingCharactersIn characterSet: CharacterSet) -> String {
    var reversed = reversed()
        .filter { String($0).rangeOfCharacter(from: characterSet) == nil }
    let excluded = enumerated()
        .filter { String($0.element).rangeOfCharacter(from: characterSet) != nil }
    for (i, char) in excluded {
        reversed.insert(char, at: reversed.index(reversed.startIndex, offsetBy: i))
    }
    return String(reversed)
}
}

您可以通過實現 textField 委托方法檢查文本字段的更改

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { }

您可以使用委托或關閉或使用通知中心來更新位於不同 class 中的 model。

冒着誇大其詞的風險:

MVC = Model 查看 Controller。

您的文本字段是您的視圖 object。
您查看 controller object 是您的 controller。
您的 model 就是您的 model。

文本字段委托方法允許您查看 controller 以從您的視圖 object 中收集更改並將這些更改安裝在 model 中。 那就這樣做吧。 實現textField(_:shouldChangeCharactersIn:replacementString:)和其他讓用戶更改文本的方法)並讓這些方法通過您的“模型函數”將更改發送到您的 model。 (您的視圖 controller 需要參考您的 model object。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM