2011-12-08 12 views
6

क्या UISearchBar में सभी टेक्स्ट का चयन करने का कोई तरीका है? मैंने कोशिश की [searchBar selectALL:], लेकिन यह सिग्नल (अपरिचित चयनकर्ता) फेंक देता है।UISearchBar सभी टेक्स्ट का चयन करें

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

उत्तर

2

यहाँ एक और सुझाव है: नया टेक्स्ट टाइप करें या मौजूदा पाठ में जोड़: किसी व्यक्ति द्वारा खोज पट्टी को सक्रिय करता है, वहाँ दो संभव इरादों कर रहे हैं। मुझे लगता है कि आपको अपने उपयोगकर्ता को पसंद करना चाहिए।

यदि वह टेक्स्ट जोड़ना चाहता है तो वह मौजूदा पाठ के अंत में स्वाभाविक रूप से टैप करता है।

यदि वह शुरू करना चाहता है, तो वह स्पष्ट बटन दबा सकता है जो खोज बार सक्रिय होने पर स्वचालित रूप से प्रकट होता है।

+0

अच्छा, यह सबसे अच्छा समाधान है। –

+5

यह व्यवहार आईओएस पर सफारी से अलग है, हालांकि जब आप पता बार टैप करते हैं तो पाठ का चयन करता है। – Luke

0

मुझे नहीं लगता कि सभी पाठों का चयन करने के लिए एक तरीका है। हो सकता है कि जब वहाँ UISearchBar पर ध्यान देने के है तुम इतनी तरह खोज पट्टी साफ कर सकते हैं - searchBar.text = @""

यानी खोज पट्टी में स्पष्ट पाठ ... आशा इस किसी तरह से मदद करता है ...

+0

इस मामले में वहाँ उपयोगकर्ता के लिए कोई रास्ता नहीं अनुरोध को बदलने के लिए है

मैं एक runloop इंतजार कर से उसके चारों ओर काम किया। यदि यह एक लंबी स्ट्रिंग है तो इसे पुनः टाइप करने के लिए परेशान हो सकता है। –

0

आप ऐसा कर सकते हैं BOOL रखते हुए यह इंगित करता है कि खोज बार टेक्स्ट फ़ील्ड को संपादित करना अभी शुरू हुआ है या नहीं। फिर, आप खोजबार प्रतिनिधि विधियों में पहली कुंजी दबा सकते हैं।

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    firstEdit = YES; 
} 

- (BOOL)searchBar:(UISearchBar *)searchBar 
     shouldChangeTextInRange:(NSRange)range 
     replacementText:(NSString *)text { 

    if (firstEdit) { 
     searchBar.text = text; 
     firstEdit = NO; 
    } 
    return YES; 
} 
+0

क्या पाठ को हाइलाइट करने का कोई तरीका है? –

4

आप कार्यक्षमता (यानी क्रूस पर अतिरिक्त नल अस्वीकार्य है) कि UITextField में पाठ का चयन आप देता है, आप UITextField खोजने के लिए UISearchBar की subviews के माध्यम से खुदाई कर सकते हैं 'को बदलने के लिए प्रकार' चाहते हैं (या UISearchBarTextField) और उसके पाठ का चयन करें:

// need to select the searchBar text ... 
UITextField * searchText = nil; 
for (UIView *subview in searchBar.subviews) 
{ 
    // we can't check if it is a UITextField because it is a UISearchBarTextField. 
    // Instead we check if the view conforms to UITextInput protocol. This finds 
    // the view we are after. 
    if ([subview conformsToProtocol:@protocol(UITextInput)]) 
    { 
     searchText = (UITextField*)subview; 
     break; 
    } 
} 

if (searchText != nil) 
    [searchText selectAll:self]; 
+2

ध्यान दें कि यह अब आईओएस 7 में काम नहीं करता है - टेक्स्ट फ़ील्ड अब दृश्य पदानुक्रम में गहराई से घिरा हुआ है। इसे ठीक करने के लिए, बस कोड को एक पुनरावर्ती संस्करण में बदलें जो पदानुक्रम को तब तक घुमाता है जब तक वह टेक्स्ट फ़ील्ड नहीं पाता। "SelectAll:" विधि के साथ भी कोई समस्या हो सकती है, जो आप वास्तव में प्राप्त करना चाहते हैं। [अधिक जानकारी के लिए यह प्रश्न देखें] (http://stackoverflow.com/questions/1689911/programatically-select-all-text-in-uitextfield)। यह भी ध्यान रखें कि मुझे इसे डीडएपियर में देखने के लिए बुलाया गया था, इसे देखने के लिए विल्लएपियर नहीं देखें। –

9

यह मानक UIResponder अर्थ विज्ञान का उपयोग कर पूरा किया जा सकता। UISearchBar के निजी दृश्य पदानुक्रम में खोदने की कोई आवश्यकता नहीं है।

[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 

आप कहीं से भी इस कॉल कर सकते हैं, और selectAll: चयनकर्ता यदि कोई हो जाने वाली वस्तुओं को का जवाब देखने के लिए प्रत्युत्तर श्रृंखला चलेंगे। मान लें कि आपकी खोज बार वर्तमान में पहला उत्तरदाता है (यदि उपयोगकर्ता इसमें टाइप कर रहा है), तो यह जवाब देगा और परिणाम सभी टेक्स्ट चुने जाएंगे। यदि नहीं, तो आप खोज बार पर becomeFirstResponder पर कॉल करके इसे पहला उत्तरदाता बना सकते हैं।

[_mySearchBar becomeFirstResponder] 
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 
2

मेरे मामले में, भेजने selectAll(_:)becomeFirstResponder बुला के तुरंत बाद काम नहीं किया।

स्विफ्ट 2:

dispatch_async(dispatch_get_main_queue()) { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
} 

स्विफ्ट 3:

DispatchQueue.main.async(execute: { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
})