Swift 4 - 如何测试TextView内容确实发生了变化?

时间:2017-11-14 03:26:31

标签: uitextview ios11 swift4 xcode9

Swift 4,iOS 11 - 我有一个预先填充了文本的UITextView,但我希望用户能够保存他们对内容所做的任何更改。我还在导航栏中有一个“保存”按钮,我想禁用它,直到用户实际更改TextView中的文本。

我知道如何测试空,但我不知道如何测试文本的编辑时间。如何修改以下内容以测试TextView内容的更改?

@IBAction func textEditingChanged(_ sender: UITextView) {
    updateSaveButtonState()
  }

func updateSaveButtonState() {
    let descriptionText = descriptionTextView.text ?? ""
    saveButton.isEnabled = !descriptionText.isEmpty
  }

1 个答案:

答案 0 :(得分:2)

我们将以动态的方式使用它,而不仅仅是在一个地方,我试图让它更容易在整个应用程序周围实现,继承UITextView是我们到达这里的唯一方法之一@holex建议isEdited布尔标志,它给了我一个想法,谢谢你。

以下是实施它的步骤:

首先设置textView的defaultText并设置将在编辑textView时调用的方法的目标,这样您就可以自定义所需的内容。

@IBOutlet weak var saveButton: UIBarButtonItem!
@IBOutlet weak var textView: SBTextView!{
    didSet{
        textView.defaultText = "Hello"
        textView.setTarget = (selector:#selector(self.updateSaveButtonState),target:self)
    }
}

让我们说你在viewDidLoad中设置了saveButton:

override func viewDidLoad() {
    super.viewDidLoad()

    // setup save button action
    saveButton.action = #selector(saveAction(_:))
    saveButton.target = self
    self.updateSaveButtonState()

}

最后是您的保存操作和使用isEdited标志更新视图的选择器。

//MARK:- Actions

@objc private func updateSaveButtonState(){

    // has not been changed keep save button disabled
    if self.textView.isEdited == false{
        self.saveButton.isEnabled = false
        self.saveButton.tintColor = .gray
    }else {
        // text has been changed enable save button
        self.saveButton.isEnabled = true
        self.saveButton.tintColor = nil // will reset the color to default
    }
}

@objc private func saveAction(_ saveButton:UIBarButtonItem){

    self.textView.updateDefaultText()

}

TextView自定义类:

//
//  SBTextView.swift
//
//
//  Created by Saad Albasha on 11/17/17.
//  Copyright © 2017 AaoIi. All rights reserved.
//

import UIKit

class SBTextView: UITextView,UITextViewDelegate {

    var isEdited = false
    private var selector : Selector?
    private var target : UIViewController?
    var setTarget: (selector:Selector?,target:UIViewController?) {
        get{
            return (selector,target)
        }
        set(newVal) {
            selector = newVal.0
            target = newVal.1
        }
    }
    var textViewDefaultText = ""
    var defaultText: String {
        get {
            return textViewDefaultText
        }
        set(newVal) {
            textViewDefaultText = newVal
            self.text = newVal
            self.isEdited = false
        }
    }

    //MARK:- Life Cycle

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)

        self.setupTextview()

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.setupTextview()
    }

    private func setupTextview(){

        // setup textview
        self.text = textViewDefaultText
        self.delegate = self

    }

    func updateDefaultText(){

        self.defaultText = self.text!

        // update save button state
        target!.perform(self.selector, with: nil, with: nil)
    }

    //MARK:- Delegate

    internal func textViewDidChange(_ textView: UITextView) {

        if textViewDefaultText != textView.text! {
            isEdited = true
        }else {
            isEdited = false
        }

        // update save button state
        target!.perform(self.selector, with: nil, with: nil)
    }

}

我希望这会有所帮助。