2015-04-08 10 views
14

में बैकस्पेस इवेंट का पता लगाएं मैं बैकस्पेस ईवेंट को कैप्चर करने के तरीके पर समाधान ढूंढ रहा हूं, अधिकांश स्टैक ओवरफ़्लो उत्तर उद्देश्य-सी में हैं लेकिन मुझे स्विफ्ट भाषा की आवश्यकता है।UITextField

सबसे पहले मैं UITextField के लिए प्रतिनिधि की स्थापना की और स्वयं के लिए सेट

self.textField.delegate = self; 

तो मैं अगर एक बैकस्पेस दबाया गया था सभी कोड रहे हैं ऑब्जेक्टिव-सी में पता लगाने के लिए shouldChangeCharactersInRange प्रतिनिधि विधि का उपयोग करने पता है। स्विफ्ट में इन निम्न विधियों की आवश्यकता है जैसा कि नीचे उपयोग किया जाता है।

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    const char * _char = [string cStringUsingEncoding:NSUTF8StringEncoding]; 
    int isBackSpace = strcmp(_char, "\b"); 

    if (isBackSpace == -8) { 
     // NSLog(@"Backspace was pressed"); 
    } 

    return YES; 
} 
+2

और इस समस्या के लिए आपका स्विफ्ट दृष्टिकोण कैसा दिखता है? कृप्या। हमें अपना प्रयास दिखाएं और हमें आपकी मदद करें जहां आपको यह गलत लगता है। स्टैक ओवरफ़्लो कोड लेखन सेवा नहीं है। – nhgrif

+0

मैं भी इस समाधान की खोज कर रहा हूं। अगर किसी को पता है तो कृपया इसका उत्तर दें। –

उत्तर

32

आशा तुम्हारी मदद करेगा: p

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    let char = string.cStringUsingEncoding(NSUTF8StringEncoding)! 
    let isBackSpace = strcmp(char, "\\b") 

    if (isBackSpace == -92) { 
     println("Backspace was pressed") 
    } 
    return true 
} 
+0

इस प्रतिनिधि विधि को निकाल दिया नहीं गया है। प्रतिनिधि 'viewDidLoad()' विधि में सेटअप है। –

+6

यह तब तक बढ़िया काम है जब तक कि टेक्स्टफ़िल्ल्ड खाली न हो – gbk

+2

-1: यह कोड काम करता है, लेकिन दुर्घटना से। [प्रलेखन] (https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619599-textfield) निर्दिष्ट करता है कि उपयोगकर्ता एक या अधिक वर्णों को हटा देता है तो 'स्ट्रिंग' एक खाली स्ट्रिंग होगी। – ravron

6

इस

public func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 

if(string == "") { 

     print("Backspace pressed"); 
     return true; 
    } 
} 

नोट का प्रयास करें: आप लौट सकते हैं "सच" आप बैकस्पेस अनुमति देना चाहते हैं। अन्यथा आप "झूठी" वापस कर सकते हैं।

+1

यदि वर्तमान पाठ टेक्स्टफील्ड खाली है तो क्या होगा? –

+0

इस प्रतिनिधि को –

+3

'स्ट्रिंग ==" "' बेहतर रूप से उपयोग करने के लिए कहा जाएगा .इस लक्षण ' – gbk

8

यदि आपको खाली टेक्स्ट फ़ील्ड में बैकस्पेस का पता लगाने की आवश्यकता है (उदाहरण के लिए यदि आपको बैकस्पेस दबाने पर पिछली टेक्स्ट फ़ील्ड पर ऑटो स्विच की आवश्यकता है), तो आप प्रस्तावित तरीकों के संयोजन का उपयोग कर सकते हैं - अदृश्य चिह्न जोड़ें और मानक प्रतिनिधि विधि textField:shouldChangeCharactersInRange:replacementString: जैसे उपयोग करें का पालन करें

  1. अदृश्य संकेत बनाएं textfield

    के लिए

    private struct Constants { 
        static let InvisibleSign = "\u{200B}" 
    } 
    
  2. सेट प्रतिनिधि

  3. घटना EditingChanged जांच पाठ पर और यदि आवश्यक हो पालन की तरह अदृश्य प्रतीक जोड़ें:

    @IBAction func didChangeEditingInTextField(sender: UITextField) { 
        if var text = sender.text { 
         if text.characters.count == 1 && text != Constants.InvisibleSign { 
          text = Constants.InvisibleSign.stringByAppendingString(text) 
          sender.text = text 
         } 
        } 
    } 
    

enter image description here

  1. प्रतिनिधि विधि textField:shouldChangeCharactersInRange:replacementString: के कार्यान्वयन में जोड़ें

    extension UIViewController : UITextFieldDelegate { 
        // MARK: - UITextFieldDelegate 
        func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    
         let char = string.cStringUsingEncoding(NSUTF8StringEncoding)! 
         let isBackSpace = strcmp(char, "\\b") 
    
         if (isBackSpace == -92) { 
          if var string = textField.text { 
           string = string.stringByReplacingOccurrencesOfString(Constants.InvisibleSign, withString: "") 
           if string.characters.count == 1 { 
            //last visible character, if needed u can skip replacement and detect once even in empty text field 
            //for example u can switch to prev textField 
            //do stuff here        
           } 
          } 
         } 
         return true 
        } 
    } 
    
13

स्विफ्ट में 3

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    let char = string.cString(using: String.Encoding.utf8)! 
    let isBackSpace = strcmp(char, "\\b") 

    if (isBackSpace == -92) { 
     print("Backspace was pressed") 
    } 
    return true 
} 

:)

1

स्विफ्ट 4: उपयोगकर्ता बैकस्पेस बटन दबाता है, तो स्ट्रिंग खाली है, इसलिए इस दृष्टिकोण बलों textfield केवल एक निर्दिष्ट से पात्रों को स्वीकार करने के चरित्र सेट (इस मामले में utf8 वर्ण) और बैकस्पेस (string.isEmpty केस)।

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    if string.cString(using: String.Encoding.utf8) != nil { 
     return true 
    } else if string.isEmpty { 
     return true 
    } else { 
     return false 
    } 
} 
0
स्विफ्ट कोड 3

और> तो

func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { 

    return true 
} 
0

मैं उपवर्गीकरण UITextField और अधिभावी deleteBackward() पसंद करते हैं क्योंकि उस shouldChangeCharactersInRange का उपयोग करने का हैक की तुलना में अधिक विश्वसनीय है:

class MyTextField: UITextField { 
    override public func deleteBackward() { 
     if text == "" { 
      // do something when backspace is tapped/entered in an empty text field 
     } 
     // do something for every backspace 
     super.deleteBackward() 
    } 
} 

shouldChangeCharactersInRange हैक टेक्स्ट फ़ील्ड में रखे गए अदृश्य चरित्र के साथ संयुक्त कई नुकसान हैं:

    एक कुंजीपटल संलग्न साथ
  • , एक अदृश्य चरित्र से पहले कर्सर जगह कर सकते हैं और बैकस्पेस अब और नहीं पाई गई है,
  • उपयोगकर्ता भी है कि अदृश्य चरित्र का चयन कर सकते हैं (एक कीबोर्ड पर Shift Arrow या यहाँ तक कि का उपयोग कर दोहन से कैरट),
  • पर और उस अजीब चरित्र के बारे में उलझन हो जाएगा स्वत: पूर्ण बार है, जब तक वहाँ के रूप में केवल इस अदृश्य चरित्र अजीब विकल्प प्रदान करता है
  • placeholder अब और नहीं दिखाया गया है,
  • स्पष्ट बटन प्रदर्शित किया जाता है यहां तक ​​कि जब यह shou clearButtonMode = .whileEditing के लिए ldn't नहीं।

बेशक, deleteBackward() ओवरराइडिंग उपclassing की आवश्यकता के कारण थोड़ा असुविधाजनक है। लेकिन बेहतर यूएक्स प्रयास के लायक बनाता है!

और यदि सबक्लासिंग नो-गो है, उदा। UISearchBar का उपयोग अपने एम्बेडेड UITextField के साथ करते हुए, विधि स्विजलिंग भी ठीक होनी चाहिए।