यदि मोडल व्यूकंट्रोलर प्रस्तुति शैली UIModalPresentationFormSheet है तो iPad कीबोर्ड खारिज नहीं करेगा


214

ध्यान दें:

IOS 4.3 के रूप में समाधान के लिए स्वीकृत उत्तर (शीर्ष मतदान एक नहीं) देखें।

यह प्रश्न iPad कीबोर्ड में खोजे गए एक व्यवहार के बारे में है, जहां यह नेविगेशन नियंत्रक के साथ एक मोडल संवाद में दिखाए जाने पर खारिज होने से इनकार करता है।

मूल रूप से, अगर मैं नीचे दिए गए लाइन के साथ नेविगेशन नियंत्रक प्रस्तुत करता हूं:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

कीबोर्ड खारिज करने से इनकार करता है। अगर मैं इस लाइन पर टिप्पणी करता हूं, तो कीबोर्ड ठीक हो जाता है।

...

मुझे दो textFields, उपयोगकर्ता नाम और पासवर्ड मिले हैं; यूज़रनेम में नेक्स्ट बटन है और पासवर्ड में डोन बटन है। यदि मैं इसे मोडल नेविगेशन कंट्रोलर में प्रस्तुत करता हूं तो कीबोर्ड दूर नहीं जाएगा।

काम करता है

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];

काम नहीं करता

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
[[UINavigationController alloc]
 initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

अगर मैं नेविगेशन कंट्रोलर पार्ट को हटाता हूं और 'b' को मोडल व्यू कंट्रोलर के रूप में पेश करता हूं, तो यह काम करता है। क्या नेविगेशन कंट्रोलर समस्या है?

काम करता है

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];

काम करता है

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc]
         initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

निम्नलिखित SO प्रश्न में समान समस्या हो रही है, लेकिन इसका कोई उत्तर नहीं है: stackoverflow.com/questions/3019709/…
Kalle

+1 आपकी महान व्याख्या के लिए धन्यवाद। लेकिन मुझे वह तरीका कहां रखना है? यह काम नहीं कर रहा है जहां मैं मॉडल नियंत्रक को प्रस्तुत करने के लिए कोड बनाता हूं ...
लोरेंजो बी

1
यह मोडल व्यू कंट्रोलर क्लास में ही होना चाहिए।
कलल

धन्यवाद। समझा। मैंने इसे UINavigationControllerकक्षा के लिए एक श्रेणी में रखा । चीयर्स।
लोरेंजो बी

मैं इस प्रश्न के लिए आपका ऋणी हूं। मैं आश्चर्यचकित resignFirstResponderथा जो निष्पादित कर रहा था लेकिन कीबोर्ड अभी भी दिखाया जा रहा है। मेरा परिदृश्य (navig contrllr के साथ प्रेजेंटफॉर्मफॉर्म) बिल्कुल आपके जैसा ही है। अनेक अनेक धन्यवाद!!
sErVerdevIL

जवाबों:


115

सामान्य रूप से प्रस्तुत किए जाने वाले दृश्य नियंत्रक में, disablesAutomaticKeyboardDismissalवापस लौटने के लिए बस ओवरराइड करें NO:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

हां, 4.3 के बाद से ऐसा लगता है। सवाल अपडेट करेंगे। धन्यवाद!
कलले

2
इसे नेविगेशन कंट्रोलर में जोड़ा जाना चाहिए
pottmeat

1
हां, तब काम करता है जब आप इसे नैविगेशन कंट्रोलर में ओवरराइट कर देते हैं। केवल यही एक चीज है जो वास्तव में मेरे लिए काम करती है।
जेम्स लॉरेनस्टिन

जीवन रक्षक! Apple इस तरह से सामान क्यों करता है? निश्चित रूप से यह NO को डिफ़ॉल्ट होना चाहिए और अगर हम वास्तव में चाहते हैं तो हमें इसे बदलने की अनुमति दें
SomaMan

UIViewController व्युत्पन्न वर्ग पर काम नहीं कर रहा है,
अव्यवस्थितऑटोमैटिक कीबोर्डवाद

172

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

संपादित करें: यहां डेवलपर मंचों पर एक Apple इंजीनियर की प्रतिक्रिया है:

UIModalPresentationFormSheet शैली के साथ प्रस्तुत किसी भी अवसर से आपका विचार था? बार-बार अंदर जाने वाले एनिमेशन से बचने के लिए, कीबोर्ड कभी-कभी स्क्रीन पर भी रहेगा, जब कोई पहला रिस्पोंडर न हो। यह एक बग नहीं है।

यह बहुत से लोगों को समस्याएं दे रहा है (स्वयं शामिल) लेकिन इस समय इसके आसपास काम करने का कोई तरीका नहीं प्रतीत होता है।

अपडेट करें:

आईओएस 4.3 और बाद में, अब आप NO लौटने के लिए अपने व्यू कंट्रोलर पर `-DisablesAutomaticKeyboardDismissal 'को लागू कर सकते हैं:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

यह समस्या को हल करता है।


7
थामने वाह, ठीक है। सिर ऊपर के लिए बहुत बहुत धन्यवाद। धिक्कार है Apple ..:
कलल

क्या आपने Apple को बग रिपोर्ट प्रस्तुत की थी? मैंने आईडी # 8384423 के तहत ऐसा किया है। मैंने व्यवहार को पुन: पेश करने के लिए एक नमूना आवेदन भी प्रस्तुत किया है।
झबरा मेंढक

3
IOS 4.3 के रूप में अब एक अस्तबल हैऑटोमेटिककेबोर्ड डिस्मिसल विधि जो इस समस्या को ठीक करती है।
कलल

5
मैं कोशिश करता हूं कि अव्यवस्थित रूप से KeyboardDismissal विधि को निष्क्रिय कर दूं, लेकिन यह अभी भी समस्या को हल नहीं करता है, इसे कैसे हल करें?
आर। डेवी

3
@Snips: आपको एक UINavigationControllerउपवर्ग बनाने की आवश्यकता होती है जो आपको मोडल फॉर्म शीट प्रस्तुत करते समय नेविगेशन नियंत्रक के रूप में disablesAutomaticKeyboardDismissalवापस लौटने NOऔर इसका उपयोग करने के लिए ओवरराइड करता है । नीचे @ miha-hribar से उत्तर देखें।
पास्कल

149

यदि आप मोडल को प्रदर्शित कर रहे हैं तो सावधान रहें UINavigationController। फिर आपको disablesAutomaticKeyboardDismissalनेविगेशन कंट्रोलर पर सेट करना होगा , व्यू कंट्रोलर पर नहीं। आप इसे श्रेणियों के साथ आसानी से कर सकते हैं।

फ़ाइल: UINavigationController + KeyboardDismiss.h

#import <Foundation/Foundation.h>

@interface UINavigationController (KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal;

@end

फ़ाइल: UINavigationController + KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h"

@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end

उस फ़ाइल में श्रेणी आयात करना न भूलें जहाँ आप UINavigationController का उपयोग करते हैं।


19
+1, अंत में मैं इस मुद्दे के लिए जानकारी का लापता टुकड़ा देखने पर प्रकाश डाला: है कि एक की जरूरत है ओवरराइड करने के लिए disablesAutomaticKeyboardDismissalकी UINavigationControllerहै, न कि स्वयं के दृश्य नियंत्रक, इस समस्या को हल करने के लिए।
डार्कडस्ट

अच्छा! मुझे जिस चीज की जरूरत थी। धन्यवाद।
जस्टिन

उत्तम। आधिकारिक डॉक्स से स्पष्ट नहीं है, लेकिन UINavigationController प्रत्युत्तर श्रृंखला में होने के कारण समझ में आता है। बहुत बढ़िया जवाब। धन्यवाद!
imnk

1
मैं एक UISplitViewController से एक मॉडल संवाद प्रस्तुत कर रहा हूं। मैंने उपरोक्त कोड की कोशिश की है, लेकिन UINplitViewController को UINavigationController के लिए प्रतिस्थापित किया है, लेकिन यह अभी भी काम नहीं करता है। क्या यह विधि UISplitViewController पर भी काम करना चाहिए?
Snips

6
किसी श्रेणी में डुप्लिकेट विधि को लागू करना एक अच्छा विचार नहीं है। आप कभी भी निश्चित नहीं हो सकते हैं कि कौन सा कार्यान्वयन कहा जाएगा, इसलिए सबसे अच्छे रूप में आप असंगत व्यवहार की अपेक्षा कर सकते हैं। UINavigationController से वारिस करने के लिए बेहतर है और अपने कस्टम वर्ग में विधि को ओवरराइड करें।
शॉन वुडवर्ड

51

मैंने UIModalPresentationPageSheetप्रस्तुति शैली का उपयोग करके और इसे प्रस्तुत करने के तुरंत बाद इसे आकार देकर हल कर लिया । इस तरह:

viewController.modalPresentationStyle = UIModalPresentationPageSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
viewController.view.superview.autoresizingMask = 
    UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleBottomMargin;    
viewController.view.superview.frame = CGRectMake(
    viewController.view.superview.frame.origin.x,
    viewController.view.superview.frame.origin.y,
    540.0f,
    529.0f
);
viewController.view.superview.center = self.view.center;
[viewController release];

हम्मम ... यह बिल्कुल सही नहीं है ... आकार बदलने के कारण मोडल को मज़ेदार बना दिया जाता है ... ऐसा लगता है कि यह नए आकार के बॉक्स या कुछ और में फिट होने के लिए सामग्री को नीचे गिरा देता है ... सब कुछ मज़ेदार लगता है। :(
टोफाह

इस के साथ रोटेशन की समस्याएं भी हैं ... यदि आप इसे मोडल करते हुए घुमाते हैं तो यह सिकुड़ जाएगा / बढ़ जाएगा जैसे कि यह एक पूर्ण पृष्ठ दृश्य हो
टोफाह

2
टोफाह, मैंने घूर्णन करते समय सिकुड़ने / बढ़ने की समस्या से निपटने के लिए कोड को संपादित किया; पर्यवेक्षक को एक लचीला शीर्ष और निचला मार्जिन देने की बात है। मुझे यकीन नहीं है कि मैं अन्य व्यवहार देख रहा हूं।
अजदेव

1
यह तभी तक काम करता है जब तक आप इस एक के ऊपर एक अन्य दृश्य को धक्का नहीं देते। क्योंकि जब आप UIModalPresentationPageSheet प्रस्तुत दृश्य के ऊपर दिए गए दृश्य को बंद करते हैं, तो यह मूल आकार में वापस आ जाता है।
V1ru8

इसने काम कर दिया। लेकिन देखने में शब्द थोड़ा धुंधला दिखता है। मुझे पता नहीं क्यों।
8

1

यदि आप एक अलग मोडल डिस्प्ले को टॉगल करते हैं तो आप कीबोर्ड को गायब कर सकते हैं। यह सुंदर नहीं है और यह नीचे चेतन नहीं करता है, लेकिन आप इसे दूर जाने के लिए प्राप्त कर सकते हैं।

अगर कोई फिक्स होता तो बहुत अच्छा होता, लेकिन अब यह काम करता है। आप इसे एक श्रेणी में वेज कर सकते हैं UIViewControllerऔर जब आप कीबोर्ड चाहते हैं तब इसे कॉल कर सकते हैं:

@interface _TempUIVC : UIViewController
@end

@implementation _TempUIVC
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

@implementation UIViewController (Helpers)

- (void)_dismissModalViewController {
    [self dismissModalViewControllerAnimated:NO];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [self release];
}

- (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated {
    [self retain];
    _TempUIVC *tuivc = [[_TempUIVC alloc] init];
    tuivc.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:tuivc animated:animated];
    if (animated) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil];
    } else
        [self _dismissModalViewController];
    [tuivc release];
}

@end

यद्यपि आप इसे देखते हैं तो इसके साथ ही सावधान रहें। जैसा मैंने कहा, यह सुंदर नहीं है, लेकिन काम करता है।

-Adam


1

आप केवल मुहावरे की जाँच करके एक सार्वभौमिक ऐप में इसके आस-पास भी काम कर सकते हैं और यदि यह एक iPad है, तो कीबोर्ड को अपने आप पॉप अप न करें और उपयोगकर्ता को जो कुछ भी वे संपादित करना चाहते हैं उसे टैप करने दें।

सबसे अच्छा समाधान नहीं हो सकता है लेकिन यह बहुत सीधा है और किसी भी फैंसी हैक की जरूरत नहीं है जो अगले प्रमुख iOS रिलीज के साथ टूट जाएगा :)


1

इस कोड को अपने विचार में रखेंविलीसैपियर: वर्तमान नियंत्रक की विधि इसे ठीक करने का एक और तरीका है:

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");
id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];
[activeInstance performSelector:@selector(dismissKeyboard)];

1

मैंने पाया कि मोडल डायलॉग में मेरे लिए disablesAutomaticKeyboardDismissalएक disablesAutomaticKeyboardDismissalफंक्शन जोड़ना और काम नहीं किया UITextField

ऑनस्क्रीन कीबोर्ड बस नहीं चलेगा।

मेरा समाधान मेरे संवाद में सभी पाठ-इनपुट नियंत्रणों को अक्षम करना था , फिर बाद में संबंधित लोगों को एक दूसरे के एक अंश को फिर से सक्षम करें।

ऐसा लगता है जैसे कि जब आईओएस देखता है कि कोई भी UITextFieldनियंत्रण सक्षम होते हैं, तो यह है कुंजीपटल से छुटकारा पाने के।


0

मुझे यकीन है कि आपने इस पर ध्यान दिया है, लेकिन आपको यकीन है कि आपके नियंत्रक वर्ग को UITextField प्रतिनिधि के रूप में ठीक से झुकाया गया है, है ना?


मैंने इसे स्वयं ही सेट किया है, और प्रतिनिधि विधियों को बुलाया जाता है, इसलिए हाँ।
कलल

0

शायद नहीं लौटे, लेकिन हाँ। तो यह दूर जा सकता है।

और आपके पास textFieldShouldEndEditingरिटर्निंग यस भी है?

और आप फायरिंग क्यों कर रहे हैं [nextResponder becomeFirstResponder]?! क्षमा करें, अब मैं देख रहा हूँ

मेरे पास कई UITextView भी हैं जिनमें सभी के पास FALSE के लिए अपनी "संपादन योग्य" संपत्ति है।

क्या हम मान सकते हैं कि उनमें से कोई भी, किसी भी संयोग से, का कोई tagमूल्य है secondField.tag+1? यदि हां, तो आप उन्हें बता रहे हैं कि आप पहले उत्तरदाता से इस्तीफा देने के बजाय पहले उत्तरदाता बनें। हो सकता है कि अगर संरचना में कुछ NSLog () डाल दें।


1
NO = मैं क्या बता सकता हूं, से नई रेखा न डालें। और इसे हां में सेट करना ठीक नहीं था।
कालू

1
एक UITextField, परिभाषा के अनुसार एक पंक्ति होने के नाते, नई कहानियों के साथ बहुत कुछ नहीं करता है, मुझे लगता है। इसलिए यह डॉक्स में बताए गए रिटर्न / डोन बटन को दबाने की प्रक्रिया के बारे में अधिक है।
mvds

क्या आप सुनिश्चित हैं कि आपने सब कुछ सही तरीके से जोड़ा है? क्या आपने NSLog("tf %x / method ...",textField);सभी प्रतिनिधि कार्यों में एक डाल दिया है?
mvds

ठीक है, प्रतिनिधि कार्यों को उचित रूप से कहा जाता है, और यदि प्रतिनिधि उचित रूप से स्थापित नहीं किया गया था, तो वे नहीं होंगे। और NSLog एक EXC_BAD_ACCESS देता है। इसके अलावा मुझे XCode में असंगत प्रकार होने के बारे में चेतावनी देता है।
कलल

डी 'ओह। क्षमा करें, देखा जाना चाहिए कि खुद। मैंने इन NSLogs के परिणामों के साथ उपरोक्त उत्तर को अपडेट किया है क्योंकि फ़ॉर्मेटिंग स्वयं कॉम में आ जाएगी ..
Kalle

0

UINavigationController से परेशान लोगों के लिए, यहां देखें एक ऐसे ही सवाल का जवाब: https://stackoverflow.com/a/10507689/321785

संपादित करें: मैं इसे मिहा हिरबर के समाधान में सुधार मानता हूं (चूंकि निर्णय उस जगह पर हो रहा है जहां इसे करना चाहिए), और UIViewController पर एक श्रेणी के बारे में पास्कल की टिप्पणी के विपरीत।


0

एक सही समाधान नहीं हो सकता है, लेकिन काम करता है
[self.view endEditing: YES];
जहाँ भी आपके बटन या हावभाव को मोडल प्रस्तुत करने के लिए लागू किया जाता है


0
Swift 4.1:
extension UINavigationController {
   override open var disablesAutomaticKeyboardDismissal: Bool {
      return false
   }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.