2012-11-20 27 views
17

आईओएस 5.1 और आईओएस 5.0 में यह काम करता है, लेकिन आईओएस 6.0 में कीबोर्ड नहीं दिखता है।आईओएस 6 में, - [यूआईटीएक्स्टफिल्ड बन गया फर्स्ट रेस्पॉन्डर] -व्यू में काम नहीं करता है WillAppear:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UITextField *textField = self.emailAddressTextField; 
    [textField becomeFirstResponder]; 
} 

अब के लिए मैंने तर्क -viewDidAppear: पर ले जाया है।

// This works but is not desirable. 
- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    UITextField *textField = self.emailAddressTextField; 
    [textField becomeFirstResponder]; 
} 

यह काम करता है, लेकिन वांछनीय नहीं है। कीबोर्ड लोड-अप एनीमेशन दृश्य लोड के बाद दिखाया गया है।

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

क्या किसी को पता है कि आईओएस 6 में दृश्य के रूप में कीबोर्ड लोड कैसे किया जाए?

अद्यतन

@ बतख की प्रतिक्रिया के आधार पर, मैं एक छोटे से अधिक परीक्षण किया था। यह UITextViewCells में निहित UITextFields के लिए विशिष्ट प्रतीत होता है।

क्या किसी के पास कोई सुझाव है?

पहला समाधान

तो पूरा विवरण। यह दो स्थिर सेल (ईमेल और पासवर्ड) के साथ एक टेबल दृश्य है। एक दृश्य में एक लॉगिन बटन है जिसे टेबल फ़ूटर व्यू असाइन किया गया है। दोनों कोशिकाओं में उनमें एक टेक्स्ट फ़ील्ड है और एक कस्टम प्रकार SICOTextFieldCell हैं।

मेरा समाधान लॉगिन बटन (टेबल फ़ूटर व्यू में) के पीछे नकली टेक्स्ट फ़ील्ड रखना था।

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UITextField *textField = self.SICO_fakeTextField; 
    [textField becomeFirstResponder]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    UITextField *textField = self.SICO_emailAddressTextField; 
    [textField becomeFirstResponder]; 
} 

नए समाधान

@stm द्वारा जवाब के आधार पर, मैं एक नया (बेहतर?) समाधान के साथ आया था।

मेरा समाधान -selectRowAtIndexPath:animated:scrollPosition: पर कॉल करना था। -[SICOTextFieldCell setSelected:animated:], जो एक कस्टम टेबल व्यू सेल है, [self.textField becomeFirstResponder] पर कॉल करता है जो कीबोर्ड को सही तरीके से खींचता है। यह अभी भी एक हैक है, लेकिन यह एक क्लीनर हैक है।

@interface SICOLogInViewController() 
@property (readonly, nonatomic) UITextField *SICO_emailAddressTextField; 
@property (readonly, nonatomic) UITextField *SICO_passwordTextField; 
@end 

@implementation SICOLogInViewController 

- (IBAction)logIn 
{ 
    // Controller Details 
} 

#pragma mark Private 

- (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 
    return cell.textField; 
} 

#pragma mark View lifecycle 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
           animated:NO scrollPosition:UITableViewScrollPositionTop]; 
} 

#pragma mark UITextFieldDelegate 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    switch (textField.returnKeyType) { 
     case UIReturnKeyGo: [self logIn];          break; 
     case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break; 
     default: break; 
    } 
    return YES; 
} 

#pragma mark Properties 

- (UITextField *)SICO_emailAddressTextField 
{ 
    return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
} 

- (UITextField *)SICO_passwordTextField 
{ 
    return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]]; 
} 

@end 
+0

आप 'viewWillAppear' में उस कोड को रखने की कोशिश की? –

+0

@yulz हां, मेरा मूल कोड '-viewWillAppear:' में था। –

+1

आपके कोड में इसे फेंकने में कुछ और है, यह ठीक चलना चाहिए। यदि आप एक त्वरित फिक्स चाहते हैं, तो [textField प्रदर्शन चयनकर्ता: @ चयनकर्ता (बनें फर्स्ट रेस्पोन्डर) के साथ कॉल करें: nil afterDelay: 0.1f]; [टेक्स्टफिल्ड बनने के बजाय फर्स्ट रेस्पॉन्डर]; यह बाद में पहला उत्तरदाता 1/10 सेट करेगा, संभावित रूप से जो भी समस्याग्रस्त कोड दे रहा है, आपके पास दौड़ने के लिए समय हो सकता है और इसे बाद में 1/10 के बाद नहीं रोक सकता है। यह एक बेवकूफ कामकाज है, हालांकि आदर्श समाधान नहीं है। – Anton

उत्तर

5

सेल बनाने के बाद सेलफॉररएटइंडेक्सपैथ विधि में कॉल करने का प्रयास करें, या तालिका में व्यूविल्लर तालिका में देखें ViewCell जिसमें टेक्स्ट फ़ील्ड है।

यदि यह आपको एक ही परिणाम देता है और आप अभी भी कीबोर्ड को पहले दिखाना चाहते हैं, तो मैं शुरुआत में कीबोर्ड प्रदर्शित करने के लिए "नकली" टेक्स्टफ़िल्ल्ड का उपयोग करूंगा। मेरा अनुमान है कि आपके टेक्स्टफिल्ल्ड को viewWillAppear से पहले जोड़ा नहीं गया है।

+0

मैं "नकली" टेक्स्टफील्ड समाधान दूसरा। – dklt

+0

मुझे लगता है कि "नकली" टेक्स्ट फ़ील्ड विजेता है! धन्यवाद के 20। मैं एक मिनट में अपना समाधान पोस्ट करूंगा। –

2

मैं viewWillAppear में अपने कोड वास्तव में, iOS6 & की कोशिश की और यह ठीक काम करने के लिए लग रहा था। जब आप किसी भिन्न दृश्य पर धक्का देते हैं तो कीबोर्ड पहले से प्रदर्शित होने का प्रयास कर रहा हूं, क्या मैं सही हूं?

+0

मुझे खेद है, लेकिन यह वास्तव में मदद नहीं करता है। यह इंगित करता है कि यह मुद्दा सार्वभौमिक नहीं है, इसलिए मैं अपना प्रश्न अपडेट करूंगा। –

-4

-viewWillAppear शायद आईओएस 6 में नहीं कहा जाता है? क्या आपने अपना कोड - (void)viewWillLayoutSubviews में डालने का प्रयास किया है?

+1

मैं सत्यापित कर सकता हूं कि '-viewWillAppear:' कहा जा रहा है। –

2

मैं वर्तमान में अपनी खुद की इनपुट फॉर्म किट लिख रहा हूं और इस समस्या के साथ कुछ घंटों तक संघर्ष कर रहा हूं। पता लगाने के बाद, मेरा कोडिंग ठीक था, मुझे यह प्रश्न आईओएस 6 में एक संभावित गड़बड़ी की ओर इशारा करते हुए पाया और इसके लिए एक समाधान पर काम किया।

यदि आपके पास एक कस्टम UITableViewCell है (या बनाएं), तो एक आसान समाधान केवल subclass - (शून्य) लेआउट सबव्यूव्स होगा; और जांचें कि क्या सेल का UITextField पहला उत्तरदाता होना चाहिए (यानी यह जांचकर कि टेक्स्ट फ़ील्ड आपके प्रतिनिधि में केंद्रित केंद्रित फ़ील्ड जैसा ही है)। यदि हां, तो बस कॉल करें (बूल) बनें फर्स्ट रेस्पॉन्डर; आपके UITextField (फिर से) पर।

यह निश्चित रूप से एक "नकली" UITextField बनाने की तुलना में एक बेहतर समाधान है;)

+0

टिप के लिए धन्यवाद, मैंने अपना जवाब अपडेट किया। –