2014-09-25 14 views
7

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

यहां कुछ प्रासंगिक कोड है। जब उपयोगकर्ता किसी टेक्स्टफील्ड के बाहर टैप करता है तो यह सब कीबोर्ड को छुपाना है। मेरे UIViews मेरी Touchview वर्ग है, जो सभी छूता प्राप्त करता है की उपवर्गों हैं:

TouchView.h:

@protocol TouchViewDelegate <NSObject> 

-(UIView *) handleTouches:(NSSet *)touches withEvent:(UIEvent *)event inView:(UIView *) view; 

@end 

@interface TouchView : UIScrollView 

@property (nonatomic, strong) id <TouchViewDelegate> touchDelegate; 

@end 

TouchView.m:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView * touchedView = [super hitTest:point withEvent:event]; 
    NSSet* touches = [event allTouches]; 
    [self.touchDelegate handleTouches:touches withEvent:event inView:touchedView]; 
    return touchedView; 

}

मैं मुख्य दृश्य के लिए कॉन्फ़िगर टचव्यू के रूप में और इसे दृश्य में शामिल किया गया:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

HMWTouchView * touchView = (HMWTouchView*) self.view; 

touchView.touchDelegate = self; 
... 
} 

यहाँ प्रतिनिधि विधि के एक कार्यान्वयन है:

-(UIView *) handleTouches:(NSSet *)touches withEvent:(UIEvent *)event inView:(UIView *) hitView { 

if (![hitView isKindOfClass:[UIButton class]]) { 
    [[UIResponder firstResponder] resignFirstResponder]; 
} 
return self.view; 
} 

यह लगता है कि यह कैसे आईओएस 8 हिट का जवाब में कम से कम एक परिवर्तन है।

+0

मैंने वही समस्या का अनुभव करता है: tackoverflow.com/questions/26651384/prevent-or-detect-events-passed-on- देखना से-ios-8-कुंजीपटल। विशेष बात यह है: यह केवल तब होता है जब ऐप के बाद ऐप पृष्ठभूमि में चला गया हो और फिर अग्रभूमि में लाया गया हो। – Codo

+1

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

उत्तर

0

समस्या यह है कि आईओएस 8.0 (कम से कम) बदलता है कि विचारों को हिट कैसे भेजा जाता है। पहले, कीबोर्ड विंडो या टेक्स्टफील्ड के भीतर हिट अवशोषित हो गए थे और हिटव्यू पर नहीं गए थे, जो इस एप्लिकेशन के लिए अच्छा काम करता है। 8.0 इसे बदलता है, और सभी हिट के माध्यम से भेजा जाता है।

इसे ठीक करने के, मैं अपने हिट परीक्षण कोड के भीतर कुंजीपटल खिड़कियों के लिए फंस, और मैं hitView तुलना दृश्य Textfield करने के लिए उन को फिल्टर करने की:

Touchview.m अब निम्नलिखित है। keyboardView विधि इस स्टैक ओवरफ़्लो जवाब से अनुकूलित है: iOS: How to access the `UIKeyboard`?

-(UIView *) keyboardView { 
//Return the current keyboard view 
UIWindow * keyboardWindow; 

UIView* keyboardView; 

UIView* primaryKeyboardView; 

for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
{ 
    if ([NSStringFromClass([window class]) isEqualToString:@"UITextEffectsWindow"]) 
    { 
     keyboardWindow = window; 
     break; 
    } 
} 

for(int i = 0 ; i < [keyboardWindow.subviews count] ; i++) 
{ 
    keyboardView = [keyboardWindow.subviews objectAtIndex:i]; 
    // keyboard found, add the button 

    if([[keyboardView description] hasPrefix:@"<UIPeripheralHost"] == YES){ 
     primaryKeyboardView = keyboardView; 
    } 
    //This code will work on iOS 8.0 
    else if([[keyboardView description] hasPrefix:@"<UIInputSetContainerView"] == YES){ 

     for(int i = 0 ; i < [keyboardView.subviews count] ; i++) 
     { 
      UIView* hostkeyboard = [keyboardView.subviews objectAtIndex:i]; 

      if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){ 
       primaryKeyboardView = hostkeyboard; 
      } 
     } 
    } 
} 
return primaryKeyboardView; 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
UIView * touchedView = [super hitTest:point withEvent:event]; 
NSSet* touches = [event allTouches]; 
UIView * keyboardView = [self keyboardView]; 
if (touchedView != keyboardView) { //Ignore the hit if it's a keyboard 
    [self.touchDelegate handleTouches:touches withEvent:event inView:touchedView]; 
} 
return touchedView; 
} 

नए प्रतिनिधि विधि:

-(UIView *) handleTouches:(NSSet *)touches withEvent:(UIEvent *)event inView:(UIView *) hitView { 

if (![hitView isKindOfClass:[UIResponder class]]) { 
    [[UIResponder firstResponder] resignFirstResponder]; 
} 
return hitView; 
} 

firstResponder विधि इस सार से है: https://gist.github.com/vilanovi/e52face5c6f00ce5254d

+0

हिटटेस्ट को निकाल दिया नहीं जा रहा है जबकि मेरा कीबोर्ड टैप किया जा रहा है? जब मैं कुंजीपटल के बाहर छुआ तो बाकी दृश्यों के लिए इसे निकाल दिया जा रहा है। इसके लिए कोई समाधान? –

0

आईओएस 8.0.2 में फिक्स्ड अब जरूरी नहीं है।

+0

यह समस्या अभी भी मेरे लिए 8.1 – Fluffhead

0

यह अभी भी मेरे लिए 8.02 में होता है

+0

में मौजूद है, मैंने हिटटेस्ट पर झुकाव समाप्त कर दिया। यह हमेशा अविश्वसनीय परिणाम उत्पन्न करता है। कभी-कभी वे प्रतिनिधि प्रति टैप दो बार और कभी-कभी 3 बार आग लगेंगे। कभी-कभी प्रेषक एक ज्ञात वर्ग था, कभी-कभी यह एक आंतरिक वर्ग था, और यह अक्सर वास्तविक टैप किए गए ऑब्जेक्ट से संबंधित नहीं था। हिटटेस्ट टूटा हुआ प्रतीत होता है। मैंने अतिथि कार्यान्वयनकर्ताओं का उपयोग करने के लिए अपना कार्यान्वयन बदल दिया और यह ठीक काम करता है। –

0

मैं एक ही समस्या मनाया - कुंजीपटल को खारिज कर दिया जाता है उपयोगकर्ता उस पर टाइप करने के लिए प्रयास करते।

मेरा समाधान एक कामकाज है। समस्या को हल करने के लिए मैं कीबोर्ड के नीचे एक डमी खाली UIView बना देता हूं। यह डमी दृश्य टैप घटनाओं को अवशोषित और उपभोग करता है और कीबोर्ड को बर्खास्त नहीं किया जाता है। मैं "UIKeyboardDidShowNotification" पर दृश्य बनाता हूं और इसे "UIKeyboardWillHideNotification" पर हटा देता हूं। यह समस्या से छुटकारा पाता है और स्क्रीन अभिविन्यास परिवर्तन के साथ अच्छी तरह से काम करता है।

/** Dummy view placed underneath the keyboard to prevent its dismissal. */ 
@property(nonatomic, strong) UIView *dummyView; 

viewDidLoad विधि में हम कीबोर्ड दिखाएं/छिपाएं सूचनाओं के लिए रजिस्टर:

// keyboard notifications - we need this to prevent keyboard dismissal 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWasShown:) 
              name:UIKeyboardDidShowNotification object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillBeHidden:) 
              name:UIKeyboardWillHideNotification object:nil]; 

यहाँ मेरे विचार नियंत्रक में कोड है कि पाठ फ़ील्ड कि कुंजीपटल दिखाई होता है फिर, 'कीबोर्ड दिखाया गया' अधिसूचना प्राप्त करने के बाद हम कीबोर्ड के नीचे डमी दृश्य बनाते हैं:

- (void)keyboardWasShown:(NSNotification*)notification { 
    // we need this to prevent keyboard dismissal  
    NSDictionary* info = [notification userInfo]; 
    CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil]; 
    self.dummyView = [[UIView alloc] initWithFrame:keyboardFrame]; 
    [self.view addSubview:self.dummyView]; 
} 

... और उन्हें हटा कुंजीपटल छिपा हुआ है:

- (void)keyboardWillBeHidden:(NSNotification*)notification { 
    [self.dummyView removeFromSuperview]; 
    self.dummyView = nil; 
}