iphone - UISearchbar clearButton कीबोर्ड को प्रदर्शित होने के लिए मजबूर करता है




keyboard appearance (8)

मेरे पास एक UISearchBar है जो टेबल व्यू के लिए लाइव फिल्टर का काम करता है। जब कीबोर्ड एंड-एडिटिंग के माध्यम से खारिज कर दिया जाता है :, क्वेरी टेक्स्ट और ग्रे परिपत्र "स्पष्ट" बटन रहता है। यहाँ से, यदि मैं ग्रे "क्लियर" बटन को टैप करता हूँ तो कीबोर्ड क्लियर हो जाता है क्योंकि टेक्स्ट क्लियर होता है।

मैं इसे कैसे न होने दूँ? यदि कीबोर्ड वर्तमान में खुला नहीं है, तो मैं चाहता हूं कि कीबोर्ड को फिर से खोलने के बिना पाठ को साफ़ करने के लिए वह बटन।

एक प्रोटोकॉल विधि है जिसे स्पष्ट बटन टैप करने पर मुझे कॉल किया जाता है। लेकिन UISearchBar को resignFirstResponder संदेश भेजने से कीबोर्ड पर कोई प्रभाव नहीं पड़ता है।


@Boliva के उत्तर का एक स्विफ्ट संस्करण।

class MySearchContentController: UISearchBarDelegate {

    private var searchBarShouldBeginEditing = true

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchBarShouldBeginEditing = searchBar.isFirstResponder
    }

    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
        defer {
            searchBarShouldBeginEditing = true
        }
        return searchBarShouldBeginEditing
    }
}

UISearchBar में "स्पष्ट" बटन searchBar.resignFirstResponder() ही textDidChange पद्धति के भीतर searchBar.resignFirstResponder() कॉल करने पर भी स्वचालित रूप से कीबोर्ड खुल जाता है।

UISearchBar को खाली करने के लिए "x" दबाने पर वास्तव में कीबोर्ड को छिपाने के लिए, निम्न कोड का उपयोग करें। इस प्रकार, भले ही textDidChange को textDidChange में कुछ टाइप करते समय textDidChange जाता है, आप केवल कीबोर्ड छिपाते हैं यदि आप इसके भीतर के सभी पाठ हटाते हैं, तो मौसम आप डिलीट बटन का उपयोग करते हैं या आप "x" पर क्लिक करते हैं:

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchBar.text!.count == 0 {
            DispatchQueue.main.async {
                searchBar.resignFirstResponder()
            }
        } else {
            // Code to make a request here.
        }
    }
}

खाली खोज बटन को छूने से खोज खाली हो जाती है। इसे प्राप्त करने का एक और तरीका है - (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)searchText में खाली पाठ की जांच - (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)searchText :

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if([searchText length] == 0)
    {
        [self dismissSearch];
    }
    else
    {
        self.searchResultsTable.hidden = YES;
        [self handleSearchForString:searchText];
    }
}

- (void)dismissSearch
{
    [self.searchBar performSelector: @selector(resignFirstResponder)
                  withObject: nil
                  afterDelay: 0.1];

    self.searchResultsTable.hidden = YES;
}

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

मेरे पास भी ऐसी ही स्थिति है और मैं खुद कोशिश कर सकता हूं।


मेरे अनुभव का सबसे अच्छा समाधान सिर्फ सिस्टम क्लियर बटन के ऊपर एक UIButton (स्पष्ट पृष्ठभूमि और कोई पाठ के साथ) डालना है और एक IBAction से कनेक्ट करना है

ऑटोलाययूट के साथ इसका आसान से अधिक है

- (IBAction)searchCancelButtonPressed:(id)sender {

    [self.searchBar resignFirstResponder];
    self.searchBar.text = @"";

    // some of my stuff
    self.model.fastSearchText = nil;
    [self.model fetchData];
    [self reloadTableViewAnimated:NO];

}

मैं अब इसमें कई बार भाग चुका हूं। मैं वास्तव में उन उत्तरों की सराहना करता हूं जो लोगों ने दिए हैं।

अंत में, मैं वास्तव में देखना चाहूंगा कि Apple हमें केवल (डेवलपर्स) यह पता लगाने की अनुमति देगा कि कब स्पष्ट बटन दबाया गया है।

यह स्पष्ट है कि इसे दबाने पर इसका पता लग जाता है क्योंकि खोज बॉक्स में कोई भी पाठ साफ़ हो जाता है।

मैं अनुमान लगा रहा हूं कि यह अभी उनकी प्राथमिकताओं की सूची में बहुत ऊपर नहीं है ... लेकिन मैं वास्तव में चाहता हूं कि Apple पर कोई व्यक्ति UISearchBar को थोड़ा प्यार दे!


मैंने पाया है कि resignFirstResponder तब काम नहीं करता जब textDidChange को एक स्पर्श से "स्पष्ट बटन" पर बुलाया जाता है। हालाँकि, performSelection: withObject: afterDelay: का उपयोग कर performSelection: withObject: afterDelay: लगता है कि यह एक प्रभावी वर्कअराउंड है:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if ([searchText length] == 0) {
        [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0];
    }
}

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar
{   
    [searchBar resignFirstResponder];   
}

यह एक पुराना सवाल है और मैं अभी उसी मुद्दे पर आया हूं और इसे निम्नलिखित तरीके से हल करने में कामयाब रहा:

जब searchBar:textDidChange: विधि को उपयोगकर्ता द्वारा 'स्पष्ट' बटन टैप करने के कारण कॉल किया जाता है, तो searchBar अभी तक पहला उत्तरदाता नहीं बन गया है, इसलिए उपयोगकर्ता का पता लगाने के लिए हम इसका लाभ उठा सकते हैं। खोज को खाली करने और खोज पर ध्यान केंद्रित करने और / या कुछ और करने का इरादा नहीं है।

उस पर नज़र रखने के लिए, हमें अपने viewController में BOOL ivar घोषित करने की आवश्यकता है जो कि searchBar प्रतिनिधि भी है (इसे कॉल करें इसे shouldBeginEditing ) और इसे YES प्रारंभिक मान के साथ सेट करें (इसे shouldBeginEditing वर्ग SearchViewController कहा जाता है):

@interface SearchViewController : UIViewController <UISearchBarDelegate> {
    // all of our ivar declarations go here...
    BOOL shouldBeginEditing;
    ....
}

...
@end



@implementation SearchViewController
...
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        ...
        shouldBeginEditing = YES;
    }
}
...
@end

बाद में, searchBar:textDidChange: , हम searchBar:textDidChange: और searchBarShouldBeginEditing: विधियों को लागू करते हैं:

- (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)searchText {
    NSLog(@"searchBar:textDidChange: isFirstResponder: %i", [self.searchBar isFirstResponder]);
    if(![searchBar isFirstResponder]) {
        // user tapped the 'clear' button
        shouldBeginEditing = NO;
        // do whatever I want to happen when the user clears the search...
    }
}


- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar {
    // reset the shouldBeginEditing BOOL ivar to YES, but first take its value and use it to return it from the method call
    BOOL boolToReturn = shouldBeginEditing;
    shouldBeginEditing = YES;
    return boolToReturn;
}

असल में, यह बात है।

श्रेष्ठ







uisearchbardelegate