वापसी की कुंजी के साथ UITextView के लिए कीबोर्ड कैसे खारिज करें?


381

आईबी की लाइब्रेरी में, परिचय हमें बताता है कि जब returnकुंजी दबाया जाता है, तो कीबोर्ड UITextViewगायब हो जाएगा। लेकिन वास्तव में returnकुंजी केवल '\ n' के रूप में कार्य कर सकती है।

मैं एक बटन जोड़ सकता हूं और [txtView resignFirstResponder]कीबोर्ड को छिपाने के लिए उपयोग कर सकता हूं ।

लेकिन क्या returnकीबोर्ड में कुंजी के लिए कार्रवाई जोड़ने का एक तरीका है ताकि मुझे जोड़ने की आवश्यकता न हो UIButton?


इस ब्लॉग पोस्ट के निर्देशों का पालन करें: iphonedevelopertips.com/cocoa/…
ManojN

जवाबों:


354

UITextViewउपयोगकर्ता के पास रिटर्न कुंजी हिट करने पर कोई विधि नहीं होती है, जिसे कॉल किया जाएगा। यदि आप चाहते हैं कि उपयोगकर्ता पाठ की केवल एक पंक्ति जोड़ने में सक्षम हो, तो उपयोग करें UITextField। रिटर्न को मारना और कीबोर्ड को छिपाने के लिए UITextViewइंटरफ़ेस दिशानिर्देशों का पालन नहीं करना।

फिर भी यदि आप ऐसा करना चाहते हैं, तो उस textView:shouldChangeTextInRange:replacementText:विधि को लागू करें UITextViewDelegateऔर यह जांचें कि क्या प्रतिस्थापन पाठ है \n, कीबोर्ड को छिपाएं।

अन्य तरीके भी हो सकते हैं लेकिन मुझे किसी के बारे में जानकारी नहीं है।


1
धन्यवाद और विधि अच्छी तरह से काम करती है। UITextView का उपयोग करने का कारण यह है कि यह कई लाइनों में पाठ पकड़ सकता है। और अब मैं इसे एक संदेश बॉक्स के रूप में उपयोग कर रहा हूं।
Chilly Zhong

28
" [textField setReturnKeyType: UIReturnKeyDone];बिल्डर " का उपयोग करके या इंटरफ़ेस बिल्डर का उपयोग करके "किया गया" रिटर्न कुंजी को बदलना काफी आसान है
केसबेश

9
ठीक है, अब मुझे समझ में आया कि
मल्टीलाइन

7
इसे हल करने का यह एक अच्छा तरीका नहीं है क्योंकि आप उपयोगकर्ता को कीबोर्ड से बाहर जाने के लिए प्रवेश का उपयोग करने के लिए प्रतिबंधित कर रहे हैं। संभवतः सबसे अच्छा तरीका एक बटन जोड़ रहा है जो resignFirstResponder विधि को निष्पादित करता है।
ग्यारह

5
@Casebash। ऐसा लगता है कि "किया गया" की वापसी कुंजी सेट करने से Xcode 6.4, स्विफ्ट 2.0 में समस्या हल नहीं होती है। मैंने IB का उपयोग करके कुंजी सेट की।
MB_iOSDeveloper

504

लगा कि मैं स्निपेट को यहीं पोस्ट करूंगा:

सुनिश्चित करें कि आप UITextViewDelegateप्रोटोकॉल के लिए समर्थन की घोषणा करते हैं ।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

स्विफ्ट 4.0 अपडेट:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

75
परेशानी यह है कि यह वास्तव में यह पता लगाने का एक तरीका नहीं है कि उपयोगकर्ता ने वापसी कुंजी का दोहन किया है । उपयोगकर्ता पाठ क्षेत्र में एक रिटर्न चरित्र पेस्ट कर सकता है और आपको एक ही प्रतिनिधि संदेश मिलेगा। मूल रूप से आप पाठ दृश्य का दुरुपयोग कर रहे हैं। कीबोर्ड को खारिज करने का तरीका (1) ऐसा बिलकुल भी नहीं करना है (जैसे कि मेल ऐप में कोई मैसेज कंपोज करते समय) या (2) इंटरफेस में कहीं और किया गया हो (नोट्स ऐप की तरह)। आप इस तरह के एक बटन को कीबोर्ड पर एक सहायक दृश्य के रूप में संलग्न कर सकते हैं, उदाहरण के लिए।
मैट

@ सैम वी कि स्निपेट मस्त आदमी था। इससे मेरा काम बनता है। धन्यवाद एक टन आदमी। क्या संख्यात्मक कीबोर्ड के प्रसार के लिए कोई स्निपेट है। सादर शिशिर
शिशिर। बॉबी

शानदार। बस एक चेतावनी है कि कुछ स्थितियों में, कीबोर्ड से छुटकारा पाने के लिए, लाइनों के साथ प्रयास करें ... [self.view endEditing: NES];
फेटी

@Vojto, iPad पर ठीक काम करता है। आपने शायद प्रतिनिधि को सेट नहीं किया है।
विंसेंट

4
मुद्दा यह है कि कीबोर्ड उस इंटरफ़ेस का हिस्सा छिपा हो सकता है जिसे खारिज करने के लिए उपयोग किया जाता है। यह वास्तव में बेतुका है कि आईओएस फ्लॉप में कीबोर्ड को खारिज करने के लिए समर्पित प्रत्येक कीबोर्ड पर एक बटन होता है ताकि उपयोगकर्ता चाहें तो ऐसा कर सकता है।
सानी एल्फिश्वि

80

मुझे पता है कि इसका उत्तर पहले ही दिया जा चुका है, लेकिन मुझे वास्तव में न्यूलाइन के लिए स्ट्रिंग शाब्दिक का उपयोग करना पसंद नहीं है, इसलिए यहां मैंने वही किया है।

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

स्विफ्ट 4.0 अपडेट:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}

6
मैं इसे इस तरह संशोधित कर सकता हूं: NSRange resultRange = [text rangeOfCharacterFromSet: [NSCharacterSet newlineCharacterSet] विकल्प: NSBackwardsSearch]; क्योंकि यह वैसे भी एक हैक है, ऐसा लगता है कि वापसी के लिए स्ट्रिंग के अंत की जांच करना एक सुरक्षित मार्ग हो सकता है।
मैक्सपॉवर

@ मैक्सपावर बहुत अच्छी टिप्पणी। इसके अलावा, प्रतिस्थापित पाठ के खिलाफ जांच करना बेहतर है, जैसे NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
रुडोल्फ एडमकोविच

एक उपयोगकर्ता की कल्पना कीजिए कि एक पाठ को कहीं और से कॉपी किया गया है जिसमें एक नई पंक्ति है। वे शायद तब भ्रमित होंगे जब पाठ को जोड़ने के बजाय ऐप केवल कीबोर्ड को खारिज कर देगा।
निकोलाई रुहे

44

मुझे पता है कि यह बहुत बार उत्तर दिया गया है, लेकिन यहाँ इस मुद्दे पर मेरे दो सेंट हैं।

मैं द्वारा उत्तर नहीं मिले samvermette और ribeto वास्तव में उपयोगी है, और भी द्वारा टिप्पणी maxpower में ribeto के जवाब। लेकिन उन दृष्टिकोणों के साथ एक समस्या है। समतुल्यता के उत्तर में मैट की समस्या का उल्लेख है और यह है कि यदि उपयोगकर्ता इसके अंदर एक लाइन ब्रेक के साथ कुछ चिपकाना चाहता है, तो कीबोर्ड कुछ भी चिपकाए बिना छिपा होगा।

इसलिए मेरा दृष्टिकोण उपरोक्त उल्लिखित समाधानों का एक मिश्रण है और केवल यह जांचना है कि क्या स्ट्रिंग दर्ज की गई है जब एक नई लाइन है जब स्ट्रिंग की लंबाई 1 है, इसलिए हम सुनिश्चित करते हैं कि उपयोगकर्ता चिपकाने के बजाय टाइप कर रहा है।

यहाँ मैंने क्या किया है:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

यह इस समस्या का सबसे अच्छा समाधान है। samvermette उत्तर उस स्थिति को नहीं बताता है जहाँ उपयोगकर्ता किसी पाठ को चिपकाना चाहता है।
मार्कोपाइवाफ़

36

एक और अधिक सुंदर तरीका कीबोर्ड को खारिज करना है जब उपयोगकर्ता कीबोर्ड के फ्रेम के बाहर कहीं टैप करता है।

सबसे पहले, UIBuilder में पहचान निरीक्षक के वर्ग "UIControl" के लिए अपने ViewController के दृश्य को सेट करें। व्यू-कंट्रोलर की हेडर फ़ाइल में नियंत्रण को खींचें और उसे टच अप इनसाइड जैसी घटना के साथ एक क्रिया के रूप में लिंक करें:

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

मुख्य ViewController फ़ाइल में, ViewController.m:

-(IBAction)dismissKeyboardOnTap:(id)sender
    {
         [[self view] endEditing:YES];
    }

आपको समान तकनीकों का उपयोग करके एक डबल टैप या लंबे स्पर्श की आवश्यकता हो सकती है। आपको UITextViewDelegate होने के लिए अपना ViewController सेट करने और TextView को ViewController से कनेक्ट करने की आवश्यकता हो सकती है। यह विधि UITextView और UITextField दोनों के लिए काम करती है।

स्रोत: बिग नर्ड रेंच

संपादित करें: मैं यह भी जोड़ना चाहूंगा कि यदि आप UIScrollView का उपयोग कर रहे हैं, तो उपरोक्त तकनीक इंटरफ़ेस धारक के माध्यम से आसानी से काम नहीं कर सकती है। उस स्थिति में, आप एक UIGestureRecognizer का उपयोग कर सकते हैं और इसके बजाय [[आत्म-दृश्य] एंड-एडिटिंग: हाँ] विधि को कॉल कर सकते हैं। एक उदाहरण होगा:

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
}

जब उपयोगकर्ता कीबोर्ड के बाहर टैप करता है और प्रवेश स्थान पर टैप नहीं करता है, तो कीबोर्ड खारिज कर देगा।


1
मुझे विचार पसंद है GestureRecognizerलेकिन बड़ी समस्या यह है कि सभी बटन या दृश्य पर नियंत्रण अब क्लिक करने योग्य नहीं है।
विशेषज्ञ

34

इस विधि को अपने दृश्य नियंत्रक में जोड़ें।

स्विफ्ट :

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

यह विधि भी आपके लिए उपयोगी हो सकती है:

/**
Dismiss keyboard when tapped outside the keyboard or textView

:param: touches the touches
:param: event   the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}

2
प्रोटोकॉल की पुष्टि करने के लिए मत भूलना UITextViewDelegate :)
स्विफ्टबॉय

मुझे नहीं लगता कि टचबेस को ओवरराइड करना और कॉल न करना एक अच्छा विचार है super.touchesBegan(touches:withEvent:)
TGO

इस कोड की सममित प्रकृति को व्यक्त करने के लिए, आपको लिखना चाहिए else { return true }
अर्थ-मामले

@ अर्थ-मायने बिल्कुल नहीं
अलेक्जेंडर वोल्कोव-

@AlexanderVolkov आप सहमत नहीं हैं कि यह एक सममित स्थिति है, आप नहीं जानते कि मेरा क्या मतलब है, आप शब्दार्थ सही कोड के मूल्य पर विश्वास नहीं करते हैं, या ...?
अर्थ-मामलों

26
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"])
        [textView resignFirstResponder];
    return YES;
}

yourtextView.delegate=self;

भी जोड़ दें UITextViewDelegate

प्रोटोकॉल की पुष्टि करने के लिए मत भूलना

यदि आपने नहीं जोड़ा if([text isEqualToString:@"\n"])तो आप संपादित नहीं कर सकते


2
-1 यह समवेत उत्तर के केवल एक खराब संस्करण है। NOयदि पाठ के बराबर है तो आप वापस लौट गए @"\n"
devios1

17

Uitextview के साथ उपयोग करते समय एक और उपाय है, आप "textViewShouldBeginEditing" में InputAccessoryView के रूप में टूलबार जोड़ सकते हैं, और इस टूलबार के किए गए बटन से आप कीबोर्ड को खारिज कर सकते हैं, इसके लिए कोड निम्नानुसार है:

ViewDidLoad में

toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];

Textviewdelegate विधि में

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
     [textView setInputAccessoryView:toolBar];
     return YES;
}

बटन डन की क्रिया जो टूलबार में है, निम्नलिखित है:

-(IBAction)btnClickedDone:(id)sender
{
    [self.view endEditing:YES];
}

17

इसका जवाब मुझे जोशबामा ने दिया इस धागे में उपलब्ध सबसे पूर्ण और साफ उत्तर मिला।

नीचे इसके लिए स्विफ्ट 4 सिंटेक्स है:

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}

यह resultRangeपरीक्षण करने का उद्देश्य है कि क्या पाठ में केवल नई सुर्खियाँ हैं जो हार्ड-कोड "\ n" से बचती हैं।
किन्हुआ


6

कीबोर्ड को खारिज करने के लिए बार को होस्ट करने के लिए नेविगेशन कंट्रोलर का उपयोग करना:

इन .h फ़ाइल:

UIBarButtonItem* dismissKeyboardButton;

इन .m फ़ाइल:

- (void)viewDidLoad {
    dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
}

-(void)textViewDidBeginEditing:(UITextView *)textView {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
    [self.textView resignFirstResponder];
    //or replace this with your regular right button
    self.navigationItem.rightBarButtonItem = nil;
}

5

जैसे मैट समवेर्मेट पर टिप्पणी करता है, मुझे "\ n" या तो पता लगाने का विचार पसंद नहीं है। UITextView में एक कारण के लिए "वापसी" कुंजी है, जो कि अगली पंक्ति में जाना है।

मेरी राय में सबसे अच्छा समाधान iPhone संदेश ऐप की नकल करना है - जो कीबोर्ड पर टूलबार (और बटन) जोड़ना है।

मुझे निम्नलिखित ब्लॉग पोस्ट से कोड मिला:

http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

कदम:

अपनी XIB फ़ाइल में टूलबार जोड़ें - ऊंचाई को 460 पर सेट करें

टूलबार बटन आइटम जोड़ें (यदि पहले से नहीं जोड़ा गया है)। यदि आपको इसे सही-संरेखित करने की आवश्यकता है, तो XIB में लचीला बार बटन आइटम भी जोड़ें, और टूलबार बटन आइटम को स्थानांतरित करें

क्रिएट एक्शन जो आपके बटन आइटम को इस्तीफे के लिए लिंक करता है।

- (IBAction)hideKeyboard:(id)sender {
    [yourUITextView resignFirstResponder];
}

-फिर:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

विषय से परे। जबकि आपका समाधान सुरुचिपूर्ण है, यह मूल प्रश्न का जवाब नहीं देता है: "वापसी कुंजी के साथ UITextView के लिए कीबोर्ड कैसे खारिज करें?"। ऐसे हालात होते हैं जब UITextField में किसी शब्द को UITextField को लपेटने के लिए नियोजित किया जाता है, न कि कई लाइनों में प्रवेश करने के लिए।
स्विफ्टआर्किटेक्ट

2
हालाँकि यह ऑफ टॉपिक है, लेकिन यह बहुत उपयोगी है। मैं यह भी चाहता हूं कि जब मैं चाहता हूं एक UITextView को कई लाइन के साथ दर्ज किया जाए और कीबोर्ड को खारिज कर दिया जाए।
यंग

5

बस इस समस्या को एक अलग तरीके से हल किया।

  • एक बटन बनाएं जिसे पृष्ठभूमि में रखा जाएगा
  • विशेषता निरीक्षक से, बटन प्रकार को कस्टम में बदलें, और बटन को पारदर्शी बनाता है।
  • पूरे दृश्य को कवर करने के लिए बटन का विस्तार करें, और सुनिश्चित करें कि बटन अन्य सभी ऑब्जेक्ट के पीछे है। ऐसा करने का आसान तरीका दृश्य में सूची दृश्य के शीर्ष पर बटन को खींचना है
  • नियंत्रण बटन को viewController.hफ़ाइल में खींचें और एक क्रिया बनाएँ (प्रेषित घटना: अंदर टच करें) जैसे:

    (IBAction)ExitKeyboard:(id)sender;
  • इस ViewController.mतरह दिखना चाहिए:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
  • ऐप चलाएं, और जब आप TextView से दूर क्लिक करते हैं, तो कीबोर्ड गायब हो जाता है

आपको जोड़ना भी होगा: - (शून्य) textViewDidEndEditing: (UITextView *) textView {[self.TextView resignFirstResponder]; }
समोआरे

5

ViewDidLoad में एक पर्यवेक्षक जोड़ें

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

और फिर "\ n" की जांच के लिए चयनकर्ता का उपयोग करें

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

यह "\ n" का उपयोग करता है और विशेष रूप से रिटर्न कुंजी की जांच नहीं करता है, लेकिन मुझे लगता है कि यह ठीक है।

अपडेट करें

नीचे रिबेटो का उत्तर देखें जो [NSCharacterSet newlineCharacterSet]कि इसके स्थान पर उपयोग करता है\n


Err यह उपयोग करता है \nऔर रिटर्न कुंजी का पता लगाया जाता है, \nइसलिए यह रिटर्न कुंजी की जांच करता है। अंतर केवल इतना है कि आप टेक्स्ट व्यूडेलगेट्स का उपयोग करने के बजाय सूचनाओं का उपयोग कर रहे हैं।
GoodSp33d

अब मुझे लगता है कि [NSCharacterSet newlineCharacterSet]\ n की बजाय जाँच करना बेहतर तरीका हो सकता है।
टोड्डब

5

स्विफ्ट कोड

UITextViewDelegate को अपनी कक्षा में लागू करें / इस तरह देखें:

class MyClass: UITextViewDelegate  { ...

स्वयं के लिए textView प्रतिनिधि सेट करें

myTextView.delegate = self

और फिर निम्नलिखित को लागू करें:

  func textViewDidChange(_ textView: UITextView) {
    if textView.text.characters.count >= 1 {

        if let lastChar = textView.text.characters.last {

            if(lastChar == "\n"){

              textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
              textView.resignFirstResponder()
            }
        }
    }
}

EDIT I ने कोड को अपडेट किया क्योंकि हैकर कोड पूरा होने के बाद एक टेक्स्टफ़ील्ड में उपयोगकर्ता इनपुट को किसी कार्यक्षेत्र के लिए बदलना और राज्य को रीसेट न करने के लिए एक अच्छा विचार नहीं है।


4

इसे इस्तेमाल करे :

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}

4

// आप इसका उपयोग कर सकते हैं ...

चरण 1. पहला कदम यह सुनिश्चित करना है कि आप UITextViewDelegateप्रोटोकॉल के लिए समर्थन की घोषणा करें । यह आपकी हेडर फ़ाइल में किया जाता है, उदाहरण के लिए यहाँ हेडर कहा जाता है

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end

चरण 2. आगे आपको नियंत्रक को UITextView के प्रतिनिधि के रूप में पंजीकृत करना होगा। ऊपर के उदाहरण से जारी रखते हुए, यहाँ कैसे मैं इनिशियलाइज़ है UITextViewसाथ EditorControllerप्रतिनिधि के रूप में ...

- (id) init {
    if (self = [super init]) {
        // define the area and location for the UITextView
        CGRect tfFrame = CGRectMake(10, 10, 300, 100);
        messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
        // make sure that it is editable
        messageTextView.editable = YES;

        // add the controller as the delegate
        messageTextView.delegate = self;
    }

चरण 3। और अब पहेली का अंतिम टुकड़ा shouldCahngeTextInRangeसंदेश के जवाब में कार्रवाई करना है:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
  replacementText:(NSString *)text
{
    // Any new character added is passed in as the "text" parameter
    if ([text isEqualToString:@"\n"]) {
        // Be sure to test for equality using the "isEqualToString" message
        [textView resignFirstResponder];

        // Return FALSE so that the final '\n' character doesn't get added
        return FALSE;
    }
    // For any other character return TRUE so that the text gets added to the view
    return TRUE;
}

3

दृश्य स्क्रीन में टच होने पर आप कीबोर्ड को छिपा सकते हैं:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }

IMHO, यह बहुत अच्छा दृष्टिकोण है, पूरे दृश्य को कवर करने वाले बटन की तुलना में बहुत बेहतर है।
वेबरोड

3

स्विफ्ट उत्तर:

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}

3

मैंने इस कोड का उपयोग उत्तरदाता को बदलने के लिए किया।

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }

क्यों नहीं उपयोग [self.view एंड एडिटिंग: हाँ]; एक बार ??
अजय_नासा

3

सवाल पूछता है कि इसे वापसी कुंजी के साथ कैसे किया जाए, लेकिन मुझे लगता है कि यह किसी के इरादे के साथ मदद कर सकता है बस यू-ट्यूब का उपयोग करते समय कीबोर्ड को गायब कर दें:

private func addToolBarForTextView() {
    let textViewToolbar: UIToolbar = UIToolbar()
    textViewToolbar.barStyle = .default
    textViewToolbar.items = [
        UIBarButtonItem(title: "Cancel", style: .done,
                  target: self, action: #selector(cancelInput)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                  target: self, action: nil),
        UIBarButtonItem(title: "Post Reply", style: .done,
                  target: self, action: #selector(doneInput))
    ]
    textViewToolbar.sizeToFit()
    yourTextView.inputAccessoryView = textViewToolbar
}

@objc func cancelInput() { print("cancel") }
@objc func doneInput() { print("done") }

override func viewDidLoad() {
    super.viewDidLoad()
    addToolBarForTextView()
}

कॉल addToolBarForTextView () में viewDidLoad या कुछ अन्य जीवन चक्र विधि।

ऐसा लगता है कि यह मेरे लिए सही समाधान था।

चीयर्स,

मूरत


1
2019 के लिए अब कॉपी और पेस्ट करें, कोई सिंटैक्स त्रुटियां और वर्तमान नामकरण नहीं है
फटी

1
अब तक का सबसे अच्छा जवाब यहाँ। मैंने बस सरल वाक्यविन्यास त्रुटि को ठीक किया, निश्चित रूप से आप चाहें तो संपादित करें। धन्यवाद!
फटी

2

ठीक है। सभी ने टोटकों के साथ उत्तर दिए हैं लेकिन मुझे लगता है कि इसे प्राप्त करने का सही तरीका है

निम्नलिखित क्रिया को " डिड एंड ऑन एक्जिट " ईवेंट में कनेक्ट करना Interface Builder। ( TextField' दी एंड एंड ऑन एग्जिट ' से निम्न विधि के लिए और cntrl- ड्रैग पर राइट-क्लिक करें ।

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}

6
-1 सवाल UITextView के बारे में है ना कि UITextField मेरे दोस्त
योगी

2
इनमें से अधिकांश उत्तर यहां वोटों के साथ हैं क्योंकि यह विभिन्न डेवलपर के विभिन्न परिदृश्यों के अनुरूप है।
कार्बोर

यदि आप एक UITextField का उपयोग कर रहे हैं, तो यह इसे करने का तरीका है। BTW, आपको उद्देश्य-सी BOOLs के लिए YES / NO का उपयोग करना चाहिए, न कि TRUE / FALSE का।
जॉन शियर

1
@ जिशियर: सही / FALSE भी ठीक है
योगी

2

UITextViewDelegateएक नए स्विफ्ट इंटरफ़ेस का उपयोग करते हुए अन्य उत्तरों के लिए सिमुलर isNewlineहोगा:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let character = text.first, character.isNewline {
        textView.resignFirstResponder()
        return false
    }
    return true
}

1
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
{
    if (range.length==0) {
        if ([text isEqualToString:@"\n"]) {
            [txtView resignFirstResponder];
            if(textView.returnKeyType== UIReturnKeyGo){

                [self PreviewLatter];
                return NO;
            }
            return NO;
        }
    }   return YES;
}

1
+ (void)addDoneButtonToControl:(id)txtFieldOrTextView
{
    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
        txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
        txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
    }

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
                                                                          0,
                                                                          [Global returnDeviceWidth],
                                                                          50)];
    numberToolbar.barStyle = UIBarStyleDefault;


    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
                                                                style:UIBarButtonItemStyleBordered
                                                               target:txtFieldOrTextView
                                                               action:@selector(resignFirstResponder)];

    numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
    [numberToolbar sizeToFit];

    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
         ((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
         ((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
}

0

मुझे पता है कि यह इस सवाल का सटीक जवाब नहीं है, लेकिन मुझे जवाब के लिए इंटरनेट पर शिकार करने के बाद यह धागा मिला। मुझे लगता है कि अन्य लोग उस भावना को साझा करते हैं।

यह UITapGestureRecognizer का मेरा विचरण है, जो मुझे विश्वसनीय और उपयोग करने में आसान लगता है - केवल TextView के प्रतिनिधि को ViewController पर सेट करें।

ViewDidLoad के बजाय मैं UITapGestureRecognizer जोड़ते हैं जब TextView संपादन के लिए सक्रिय हो जाता है:

-(void)textViewDidBeginEditing:(UITextView *)textView{
    _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer: _tapRec];
    NSLog(@"TextView Did begin");
}

जब मैं TextView के बाहर टैप करता हूं, तो दृश्य संपादन मोड समाप्त हो जाता है और UITapGestureRecognizer स्वयं को हटा देता है ताकि मैं दृश्य में अन्य नियंत्रणों के साथ सहभागिता जारी रख सकूं।

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}

आशा है कि ये आपकी मदद करेगा। यह इतना स्पष्ट लगता है लेकिन मैंने वेब पर कहीं भी इस समाधान को नहीं देखा है - क्या मैं कुछ गलत कर रहा हूं?


0

TextView के लिए प्रतिनिधि सेट करने के लिए मत भूलना - अन्यथा इस्तीफा देने वाला काम नहीं करेगा।



0

Xcode 6.4 के लिए। स्विफ्ट 1.2। :

   override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
    {
        super.touchesBegan(touches, withEvent: event)
        if let touch = touches.first as? UITouch
        {
            self.meaningTextview.resignFirstResponder()
        }
    }

0

UIToolbarउपयोग करने के बजाय आसान बनाने के लिए आपको शीर्ष UITextView में जोड़ना चाहिएshouldChangeTextIn

स्विफ्ट 4 में

let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
        ]
        textView.inputAccessoryView = toolbar
@objc func doneAction(){
 self.textView.resignFirstResponder()
}

अब तक का सबसे अच्छा उपाय। ध्यान दें कि फ्रेम सेट करने के बजाय, बस उपयोग करेंtoolbar.sizeToFit()
Fattie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.