2016-11-21 2 views
0

Ich habe eine ViewController mit einem UITextView und einem "Send" -Bar-Button-Element in der Navigationsleiste, die den Text in der textView übermittelt. Da UITextView keinen Platzhaltertext wie das UITextField unterstützt, handle ich selbst mit dem folgenden Code, der sich in der UITextViewDelegate-Methode, shouldChangeTextInRange, befindet.Swift: Deaktivieren Sie bar-Taste für Whitespace/Newline-only Text in UITextView mit Platzhaltertext

Hinweis: Der folgende Code, den ich bisher geschrieben habe, aktiviert die Schaltfläche Senden für Whitespace-/Newline-Zeichen. Aber das ist, was mit Ich brauche Hilfe:

Wie kann ich auf die Schaltfläche Senden deaktivieren, wenn der Textview nur Leerzeichen oder Zeilenumbrüche enthält, aber ermöglichen es sonst während auch/Einstellen der Platzhalter-Text Clearing angemessen?

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 

    // Combine the postTextView text and the replacement text to 
    // create the updated text string 
    let currentText : NSString = textView.text 
    let updatedText = currentText.stringByReplacingCharactersInRange(range, withString:text) 

    // If the updated textView text will be empty, disable the send button, 
    // set the placeholder text and color, and set the cursor to the beginning of the text view 
    if updatedText.isEmpty { 
     sendBarButton.enabled = false 
     textView.text = "Write something..." 
     textView.textColor = UIColor.lightGrayColor() 
     textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument) 
     return false 
    } 

    // If the textView's placeholder is showing (i.e.: the textColor is light gray for placeholder text) 
    // and the length of the replacement string is greater than 0, 
    // clear the text view and set its color to black to prepare for the user to enter text 
    else if (textView.textColor == UIColor.lightGrayColor() && !(text.isEmpty)) { 
     sendBarButton.enabled = true 
     textView.text = nil 
     textView.textColor = UIColor.blackColor() 
    } 

    return true 
} 

UPDATE: Ich verstehe der folgende Code verwendet werden kann, Leerzeichen und Zeilenumbrüche zu trimmen/erkennen, aber nicht sicher, wie es hier in diesem Fall anzuwenden: stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).isEmpty

Vielen Dank für Ihre Hilfe.

Antwort

1

Ich werde diesen Weg machen. Ich habe einen Platzhalter UILabel auf UITextView hinzugefügt, den ich je nach der Anzahl der eingegebenen Zeichen ein- oder ausblenden werde (0 oder ungleich null).

Hier ist eine Sample angeschlossen.

Dies ist in Swift 3.x Syntax. Es funktioniert nur mit Xcode 8.x.

ich nur die Verwendung einiger mehr UITextView Delegatmethoden gemacht, wie unten

import UIKit 

class ViewController: UIViewController { 

    var placeHolderLabel:UILabel! 
    @IBOutlet weak var myTextView: UITextView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     placeHolderLabel = UILabel(frame: CGRect(x:5, y:5, width:240, height:22)) 
     placeHolderLabel.text = "Send Placeholder" 

     //Set the font same as your textView font 
     placeHolderLabel.font = UIFont.systemFont(ofSize: 15.0) 

     //set the placeholder color 
     placeHolderLabel.textColor = UIColor.lightGray 

     myTextView.addSubview(placeHolderLabel) 

     //Initially disable the send button 
     sendButton.isEnabled = false 
    } 
} 

// MARK: - TextView Delegates 
extension ViewController:UITextViewDelegate { 

    // Will handle the case for white spaces and will keep the send button disabled 
    func textViewDidChange(_ textView: UITextView) { 
     if(textView.text.characters.count != 0) { 
      if textView.text.characters.count > 1 { 
      return 
      } 
      textView.text = textView.text.trimmingCharacters(in: CharacterSet.whitespaces) 
      if textView.text.characters.count == 0 { 
       placeHolderLabel.isHidden = false 
       print("Disable Button") 
       sendButton.isEnabled = false 
      } else { 
       placeHolderLabel.isHidden = true 
       print("Enable Button") 
       sendButton.isEnabled = true 
      } 
     } 
     else { 
      placeHolderLabel.isHidden = false 
      print("Disable Button") 
      sendButton.isEnabled = false 
     } 
    } 

    // You can modify this, as I just made my keyboard to return whenever return key is pressed. 
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
     if(text == "\n") { 
      textView.resignFirstResponder() 
      return false 
     } 
     return true 
    } 

    func textViewDidBeginEditing(_ textView: UITextView) { 
     if(textView.text.characters.count != 0) { 
      placeHolderLabel.isHidden = true 
     } 
     else { 
      placeHolderLabel.isHidden = false 
     } 
    } 

    func textViewDidEndEditing(_ textView: UITextView) { 
     if(textView.text.characters.count != 0) { 
      placeHolderLabel.isHidden = true 
     } 
     else { 
      placeHolderLabel.isHidden = false 
     } 
    } 
} 
+0

Dank Rajan, aber ich glaube, das ist immer noch die Bar-Taste Leerzeichen ermöglicht . – DiligentDev

+0

Dafür müssen wir etwas Logik schreiben, trimmen Sie einfach Ihre Zeichen für Leerzeichen. Ich werde den Code in einem Augenblick aktualisieren –

+0

Danke. Ja, ich kann die Methode 'stringByTrimmingCharactersInSet (NSCharacterSet.whitespaceAndNewlineCharacterSet())' verwenden, um die Whitespace- und Newline-Zeichen zu trimmen, aber ich muss die Sendebar-Schaltfläche für diese Zeichen deaktivieren, bis ein anderes Zeichen eingegeben wird. – DiligentDev

0

konnte ich verwenden Teil @Rajan Maheshwaris Antwort in meiner Erweiterung gezeigt, die eine einfache Lösung für mein eigenes Problem zu schaffen (ich glaube, es kann noch weiter vereinfacht werden:

var placeholderLabel: UILabel! 

func viewDidLoad() { 
     placeholderLabel = UILabel(frame: CGRect(x: 5, y: 5, width: 240, height: 18)) 
     placeholderLabel.text = "Placeholder text..." 
     placeholderLabel.textColor = UIColor.lightGrayColor() 
     placeholderLabel.sizeToFit() 
     postTextView.addSubview(placeholderLabel) 
} 

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 

     let currentText: NSString = textView.text 
     let updatedText = currentText.stringByReplacingCharactersInRange(range, withString:text) 
     let trimmedText = updatedText.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 

     if !updatedText.isEmpty { 
      // Contains any text: hide placeholder 
      placeholderLabel.hidden = true 
      if trimmedText.isEmpty { 
       // Only whitespace and newline characters: disable button 
       sendBarButton.enabled = false 
      } else { 
       // No whitespace- and newline-only characters: enable button 
       sendBarButton.enabled = true 
      } 
     } else { 
      // No text at all: show placeholder, disable button 
      placeholderLabel.hidden = false 
      sendBarButton.enabled = false 
     } 
     return true 
    } 

Kredit: Dank @Rajan Maheshwaris Hilfe

Verwandte Themen