2012-05-26 13 views
20

जो मैं करने की कोशिश कर रहा हूं वह है आईपैड पर सफारी में "पृष्ठ पर खोजें" खोज फ़ंक्शन के समान कुछ बनाना।कुंजीपटल छोड़ने के बाद इनपुट एक्सेसरीव्यू दृश्य को खारिज कर दिया गया है

मैं इसमें कुछ आइटमों के साथ UIToolbar का उपयोग कर रहा हूं और इसे पर inputAccessoryView के रूप में सेट करके कीबोर्ड से जुड़ा हुआ हूं। एक आकर्षण की तरह काम करता है, लेकिन एक चीज है जिसे मैं समझ नहीं सकता। सफारी में, जब आप कुछ खोजते हैं, तो कीबोर्ड गायब हो जाता है लेकिन टूल बार स्क्रीन के नीचे रहता है।

क्या किसी को यह पूरा करने के बारे में कोई संकेत है? एकमात्र समाधान जिसे मैं सोच सकता हूं, एक कुंजीपटल खारिज किए गए ईवेंट का जवाब देना है और फिर UIToolBar खींचें और एक कस्टम एनीमेशन बनाएं जो इसे स्क्रीन के नीचे ले जाएं। लेकिन यह हैकी है। मैं एक और अधिक सुरुचिपूर्ण समाधान की तलाश में हूं। ऐसा कुछ जो मुझे निर्णय ले सकता है कि कुंजीपटल खारिज होने पर इनपुट एक्सेसरी व्यू के साथ क्या करना है।

उत्तर

41

पर UIToolBar कि इनपुट गौण दृश्य के रूप में निर्दिष्ट नहीं की गई साथ समाप्त हो गया है, और ऊपर स्लाइड करें और यह इस तरह किया जाता है:

आपके विचार नियंत्रक में एक संपत्ति के लिए अपने UIToolbar निरुपित :

- (BOOL)canBecomeFirstResponder{ 

    return YES; 

} 

- (UIView *)inputAccessoryView{ 

    return self.inputAccessoryToolbar; 

} 
:

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar; 

अपने शीर्ष दृश्य नियंत्रक में, इन विधियों को जोड़ने 0

और फिर (वैकल्पिक रूप से, के रूप में यह आम तौर पर आवश्यक नहीं होना चाहिए), जब भी कुंजीपटल छिपा हुआ हो जाता है, बस फोन:

[self becomeFirstResponder]; 

इस तरह, आपके inputAccessoryToolbar दोनों अपने दृश्य नियंत्रक के और अपने पाठ को देखने के इनपुट होगा सहायक दृश्य।

+2

मेरी इच्छा है कि मैं इसके लिए आपके बक्षीस अंक दे सकूं। – zekel

+1

यह प्रतिभा है – Adolfo

+1

यह आईओएस 8 पर काम नहीं कर रहा है, मुझे UIViewControllerHierarchyInconsistency, कोई विचार है? – MegaManX

7

मैं नीचे UIKeyboardWillShowNotification/UIKeyboardWillHideNotification

+0

धन्यवाद, मुझे लगता है कि यह वास्तव में जाने का एकमात्र तरीका है। –

+1

यही वह है जो मैं वर्तमान में भी कर रहा हूं, यह उम्मीद कर रहा था कि एक और समाधान था। मुझे लगता है कि नहीं :( –

+1

@BradMoore, एक और समाधान है। कृपया मेरा उत्तर देखें। – arik

2

@ अरिक का जवाब देने के लिए जोड़ा जा रहा है, यहाँ स्विफ्ट संस्करण है:

class ViewController: UIViewController { 

    @IBOutlet var textField: UITextField!  

    // Input Accessory View 
    private var inputAccessoryToolbar: UIToolBar? 
    override func canBecomeFirstResponder() -> Bool { 
    return true 
    } 
    override var inputAccessoryView: UIView? { 
    return inputAccessoryToolbar 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50)) 
    textField.inputAccessoryView = inputAccessoryToolbar 
    } 

    // UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
    becomeFirstResponder() 
    return true 
    } 
} 

स्वच्छ समाधान के लिए धन्यवाद!

+0

स्विफ्ट 3/4 में, 'CanBecomeFirstResponder' और' inputAccessoryView' अब फ़ंक्शंस/विधियों के बजाय गुण हैं। – Annjawn

0

पूर्व उत्तरों के आधार पर स्विफ्ट 4 में अपडेट करें। आप storyboards के माध्यम से उपकरण पट्टी जोड़ देते हैं तो आप इस मामले में, जब भी पाठ क्षेत्र बातें पहली बार प्रत्युत्तर इस्तीफा, यह मुख्य दृश्य के लिए सबसे पहले प्रत्युत्तर डिफ़ॉल्ट में इस

class ViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 
    @IBOutlet var toolbar: UIToolbar! 

    override var canBecomeFirstResponder: Bool { 
     get { 
      return true 
     } 
    } 

    override var inputAccessoryView: UIView { 
     get { 
      return self.toolbar 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textField.inputAccessoryView = toolbar 
    } 
} 

कर सकते हैं। ध्यान रखें, आप पहले उत्तरदाता को स्पष्ट रूप से इस्तीफा दे सकते हैं, और मुख्य यूआई तत्वों के रूप में मुख्य दृश्य सेट कर सकते हैं यदि कई यूआई तत्व हैं और पहले उत्तरदाता इस्तीफे के बाद अवांछित दृश्य को डिफ़ॉल्ट करते हैं।

संबंधित मुद्दे