मैं कैसे प्रोग्राम की जाँच कर सकता हूँ कि क्या कोई कीबोर्ड iOS ऐप में मौजूद है?


111

मुझे अपने iOS ऐप में कीबोर्ड की दृश्यता की स्थिति की जांच करनी होगी।

स्यूडोकोड:

if(keyboardIsPresentOnWindow) {
    //Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
    //Do action 2
}

मैं इस स्थिति की जांच कैसे कर सकता हूं?


व्हाट ऐप? क्या भाषा? क्या मंच? मेरा सबसे अच्छा अनुमान iPhone है?
निक बेडफोर्ड

4
सवाल तय। खेल शुरू किया जाय!
रॉबर्ट हार्वे


जवाबों:


68

… या आसान तरीका अपनाएं:

जब आप एक टेक्स्टफ़िल्ड दर्ज करते हैं, तो यह पहली प्रतिक्रिया हो जाती है और कीबोर्ड प्रकट होता है। आप कीबोर्ड की स्थिति की जांच कर सकते हैं [myTextField isFirstResponder]। यदि यह वापस आता है YES, तो कीबोर्ड सक्रिय है।


21
अच्छा समाधान, हालांकि यह काम नहीं करेगा, अगर एक हार्डवेयर कीबोर्ड का उपयोग किया जाता है (iPad पर असामान्य नहीं है)।
आंद्रेई हर्फ़र्ड

4
इस सवाल का जवाब नहीं है। यह आपको बताता है कि क्या पाठ क्षेत्र पहला उत्तरदाता है। मेरे पास कई चाइल्ड व्यू कंट्रोलर्स के साथ एक व्यू कंट्रोलर है, जिसमें सभी UITextFields होते हैं। इस पद्धति का उपयोग करते हुए, मैं अपने माता-पिता के दृश्य नियंत्रक से नहीं बता सकता कि क्या कीबोर्ड दिखाया गया है। अन्य उत्तरों में बताई गई अधिसूचना पद्धति का उपयोग करने का एकमात्र विश्वसनीय तरीका है
टिमहिटिंग जूल

63

ड्रोनवर्डवर्ड का कोड बहुत करीब है, लेकिन UIKit के नेमस्पेस से टकरा जाता है और इसे इस्तेमाल करना आसान बनाया जा सकता है।

@interface KeyboardStateListener : NSObject {
    BOOL _isVisible;
}
+ (KeyboardStateListener *)sharedInstance;
@property (nonatomic, readonly, getter=isVisible) BOOL visible;
@end

static KeyboardStateListener *sharedInstance;

@implementation KeyboardStateListener

+ (KeyboardStateListener *)sharedInstance
{
    return sharedInstance;
}

+ (void)load
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    sharedInstance = [[self alloc] init];
    [pool release];
}

- (BOOL)isVisible
{
    return _isVisible;
}

- (void)didShow
{
    _isVisible = YES;
}

- (void)didHide
{
    _isVisible = NO;
}

- (id)init
{
    if ((self = [super init])) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

@end

4
उसे अपने पूल की आवश्यकता क्यों है?
डैन रोसेनस्टार्क

18
+loadएक विशेष विधि है जिसे ऑब्जेक्टिव-सी रनटाइम कहा जाता है। यह ऐप बाइनरी लोड के बाद प्रत्येक वर्ग के लिए कहा जाता है, लेकिन main()फ़ंक्शन में प्रवेश करने से पहले । इस बात की कोई गारंटी नहीं है कि एक ऑटोरेलिस पूल लाइव होगा।
रपेट्रीक

1
MattDiPasquale: यदि + लोड विधि को हटा दिया जाता है, तो साझा किया गया है। चूँकि इस बात की कोई गारंटी नहीं है कि जब रनटाइम + लोड विधि को लागू करता है, तो ऑटोरेलिज़ पूल सक्रिय होता है, सिस्टम-प्रदान की जाने वाली कक्षाओं में सभी कॉल को लपेटना आवश्यक होता है, जब वे ऑटोरेलिज़ कहते हैं।
रैप्ट्रीच

3
अच्छा उत्तर! मैं जानता हूँ कि यह कई साल पुराना है लेकिन NSAutoreleasePool alloc/ releaseअब में कोड के आसपास के द्वारा बदला जा सकता है@autoreleasepool { }
chown

3
ऑब्जर्वर को हटाने के लिए मत भूलना, शायद KeyboardStateListener के डीललोक में।
सुशीग्रैस जैकब

32

एक बनाएं UIKeyboardListenerजब आप जानते हैं कुंजीपटल नहीं दिखाई फोन करके उदाहरण के लिए, [UIKeyboardListener shared]से applicationDidFinishLaunching

@implementation UIKeyboardListener

+ (UIKeyboardListener) shared {
    static UIKeyboardListener sListener;    
    if ( nil == sListener ) sListener = [[UIKeyboardListener alloc] init];

    return sListener;
}

-(id) init {
    self = [super init];

    if ( self ) {
        NSNotificationCenter        *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(noticeShowKeyboard:) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(noticeHideKeyboard:) name:UIKeyboardWillHideNotification object:nil];
    }

    return self;
}

-(void) noticeShowKeyboard:(NSNotification *)inNotification {
    _visible = true;
}

-(void) noticeHideKeyboard:(NSNotification *)inNotification {
    _visible = false;
}

-(BOOL) isVisible {
    return _visible;
}

@end

नोट: आप +(void)loadइस श्रोता वर्ग पर इनिट को कॉल करने के लिए उपयोग कर सकते हैं, ताकि यह किसी भी प्रोजेक्ट में ड्रैग-एंड-ड्रॉप के रूप में काम करेगा और आपको कहीं भी इनिट याद रखने की बजाय दूसरे ऐप लॉन्च से आरंभ कर सके।
अल्बर्ट रेनशॉ

30

मुझे लगता है कि आपको कीबोर्ड के बारे में दी गई सूचनाओं का उपयोग करने की आवश्यकता है:

प्रेषक: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html

कीबोर्ड सूचनाएं

जब सिस्टम कीबोर्ड को दिखाता या छिपाता है, तो यह कई कीबोर्ड सूचनाएं पोस्ट करता है। इन सूचनाओं में कीबोर्ड के बारे में जानकारी होती है, जिसमें इसका आकार भी शामिल होता है, जिसका उपयोग आप गणनाओं के लिए कर सकते हैं, जिसमें बढ़ते विचार शामिल होते हैं। इन सूचनाओं के लिए पंजीकरण करना कीबोर्ड के बारे में कुछ प्रकार की जानकारी प्राप्त करने का एकमात्र तरीका है। सिस्टम कीबोर्ड से संबंधित घटनाओं के लिए निम्नलिखित सूचनाएं देता है:

* UIKeyboardWillShowNotification
* UIKeyboardDidShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardDidHideNotification

इन सूचनाओं के बारे में अधिक जानकारी के लिए, UIWindow क्लास संदर्भ में उनका विवरण देखें। कीबोर्ड को दिखाने और छिपाने के तरीके के बारे में जानकारी के लिए, टेक्स्ट और वेब देखें।


मैंने इन सूचनाओं की जाँच की, लेकिन इन सूचनाओं की जाँच करना नहीं जानता। यदि आप कुछ उदाहरण पोस्ट कर सकते हैं, तो यह बहुत मददगार होगा।
जितेंद्र सिंह

2
NSNotificationCenter पर एक नजर है। आपको उन सूचनाओं के लिए पंजीकरण करना होगा, जिनमें आप रुचि रखते हैं। जब आपका आवेदन बाहर निकलता है, तो अपंजीकृत करना न भूलें।
थॉमस मुलर

13

स्विफ्ट 3 कार्यान्वयन

    import Foundation
class KeyboardStateListener: NSObject
{
    static let shared = KeyboardStateListener()
    var isVisible = false

    func start() {
        NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func didShow()
    {
        isVisible = true
    }

    func didHide()
    {
        isVisible = false
    } 
}

1
मैं विनीत में पर्यवेक्षक को हटाने की सलाह देता हूं या अगर यह देखने के लिए एक दृश्य नियंत्रक है तो विडिसैपियर
जुआन बोरो

3
एक विलन का उपयोग करने का कोई मतलब नहीं है अगर यह एक सिंगलटन है क्योंकि यह कभी भी विघटित नहीं होगा
सायरन

11

कीबोर्ड दिखाने के लिए संकेत के रूप में विंडो सबव्यू पदानुक्रम का उपयोग करना एक हैक है। यदि Apple उनके अंतर्निहित कार्यान्वयन को बदल देता है तो ये सभी उत्तर टूट जाएंगे।

सही तरीका यह होगा कि आप कीबोर्ड शो की निगरानी करें और अपने ऐप डेलीगेट के अंदर नोटिफिकेशन एप्लिकेशन को चौड़ा करें।

AppDelegate.h में:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (assign, nonatomic) BOOL keyboardIsShowing;

@end

AppDelegate.m में:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Monitor keyboard status application wide
    self.keyboardIsShowing = NO;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];

    return YES;
}

- (void)keyboardWillShow:(NSNotification*)aNotification
{
    self.keyboardIsShowing = YES;
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    self.keyboardIsShowing = NO;
}

तो आप का उपयोग कर जाँच कर सकते हैं:

BOOL keyboardIsShowing = ((AppDelegate*)[UIApplication sharedApplication].delegate).keyboardIsShowing;

यह ध्यान दिया जाना चाहिए कि जब उपयोगकर्ता ब्लूटूथ या बाहरी कीबोर्ड का उपयोग कर रहा है तो कीबोर्ड शो / हिडन नोटिफिकेशन में आग नहीं लगेगी।


10

एक एक्सटेंशन जोड़ें

extension UIApplication {
    /// Checks if view hierarchy of application contains `UIRemoteKeyboardWindow` if it does, keyboard is presented
    var isKeyboardPresented: Bool {
        if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"),
            self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
            return true
        } else {
            return false
        }
    }
}

फिर जांचें कि क्या कीबोर्ड मौजूद है,

if UIApplication.shared.isKeyboardPresented {
     print("Keyboard presented")
} else { 
     print("Keyboard is not presented")
}

कर सकते हैंguard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
क्ले ब्रिजेज़

5

यह यहाँ Apple द्वारा प्रकाशित iOS पाठ प्रोग्रामिंग गाइड से है: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement.html

मूल रूप से अपने ViewDidLoad में "registerForKeyBoardNotifications" को कॉल करें। तब हर बार कीबोर्ड सक्रिय हो जाता है, "कीबोर्डवॉश" कहा जाता है। और हर बार जब कीबोर्ड गायब हो जाता है, तो "keyboardWillBeHidden" कहा जाता है।

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    NSLog(@"Keyboard is active.");
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    NSLog(@"Keyboard is hidden");
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

5

अब iOS8 में यह समाधान काम नहीं करता है। यह शुरू में IOS4 / 5 के लिए लिखा गया था।

इस समाधान का प्रयास करें:

- (BOOL) isKeyboardOnScreen 
{
    BOOL isKeyboardShown = NO;

    NSArray *windows = [UIApplication sharedApplication].windows;
    if (windows.count > 1) {
        NSArray *wSubviews =  [windows[1]  subviews];
        if (wSubviews.count) {
            CGRect keyboardFrame = [wSubviews[0] frame];
            CGRect screenFrame = [windows[1] frame];
            if (keyboardFrame.origin.y+keyboardFrame.size.height == screenFrame.size.height) {
                isKeyboardShown = YES;
            }
        }
    }

    return isKeyboardShown;
}

2
यह मान लेना अमान्य है कि एकाधिक विंडो में एक कीबोर्ड होता है, और यह कि कीबोर्ड हमेशा दूसरा तत्व होता है।
jmah

1
@ जम्ह बेशक यह सार्वभौमिक दृष्टिकोण नहीं है, लेकिन यह बड़ी संख्या में अनुप्रयोग मामलों को कवर करता है। कीबोर्ड के बारे में जानकारी प्राप्त करने का कोई भी प्रयास कुछ विशिष्ट दृश्य पदानुक्रम का उपयोग करता है क्योंकि Apple इस मामले के लिए कोई उपयोगी एपीआई प्रदान नहीं करता है।
पुरुष

यह काम नहीं करता है, जो मेरे लिए काम करता है वह सभी विचारों के माध्यम से और सभी UITextFields या UITextView चेक के माध्यम से पुनरावृत्त हुआ था यदि वे पहले उत्तरदाता हैं ... यदि कोई भी सच्चा कीबोर्ड लौटाता है तो वह अन्य नहीं दिखाई देता है
amd

4

कुछ अवलोकन:

एक सिंगलटन ऑब्जेक्ट के लिए अनुशंसित पैटर्न निम्नानुसार होगा। dispatch_once सुनिश्चित करता है कि एक थ्रेड-सुरक्षित तरीके से एक बार वर्ग को आरंभीकृत किया जाता है, और स्थिर चर बाहर दिखाई नहीं देता है। और यह मानक GCD है, इसलिए Objective-C के निम्न स्तर के विवरण के बारे में जानने की आवश्यकता नहीं है।

+ (KeyboardStateListener *)sharedInstance
{
    static KeyboardStateListener* shared;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[KeyboardStateListener alloc] init];
        // Other initialisations
    });

    return shared;
}

आमतौर पर आप यह जानना नहीं चाहते हैं कि कीबोर्ड दिखाई दे रहा है या नहीं, लेकिन यह कितना बड़ा है। कीबोर्ड में सभी का आकार समान नहीं होता है। iPhone कीबोर्ड, iPad कीबोर्ड से छोटे होते हैं। तो आप एक और संपत्ति चाहते हैं @property (readonly, nonatomic) CGRect keyboardRect;जो नोटिस में सेट है

NSValue* value = notification.userInfo [UIKeyboardFrameEndUserInfoKey];
_keyboardRect = value.CGRectValue;

यह ध्यान रखना महत्वपूर्ण है कि आयत UIWindow में समन्वयित है और स्क्रीन रोटेशन का सम्मान नहीं करता है। तो कॉलर उस आयत को कॉल करके परिवर्तित कर देगा

KeyboardStateListener* listener = [KeyboardStateListener sharedInstance];
CGRect windowRect = listener.keyboardRect;
CGRect viewRect = [myView convertRect:windowRect fromView:self.window];

यदि कीबोर्ड दिखाई देने के दौरान उपयोगकर्ता स्क्रीन को घुमाता है, तो एप्लिकेशन को बताया जाएगा कि कीबोर्ड छिपा हुआ है, फिर दिखाया गया है। जब यह दिखाया जाता है, तो अन्य विचारों को अभी तक घुमाए जाने की संभावना नहीं है। इसलिए यदि आप कीबोर्ड छिपाने / दिखाने की घटनाओं को स्वयं देखते हैं, तो निर्देशांक को तब परिवर्तित करें जब आपको वास्तव में उनकी आवश्यकता हो, अधिसूचना में नहीं।

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

श्रोता को कीबोर्ड छिपाए जाने के दौरान आरंभीकृत किया जाना चाहिए, अन्यथा पहली अधिसूचना छूट जाएगी, और यह माना जाएगा कि कीबोर्ड छिपा हुआ है जब यह नहीं है।

इसलिए यह जानना काफी महत्वपूर्ण है कि आप वास्तव में क्या चाहते हैं। यह कोड कीबोर्ड के रास्ते से हटने के लिए उपयोगी है (एक विभाजित या अनकवर्ड कीबोर्ड के साथ, यह उपयोगकर्ता की जिम्मेदारी है)। यह आपको नहीं बताता है कि उपयोगकर्ता स्क्रीन पर एक कीबोर्ड देख सकता है (विभाजन कीबोर्ड के मामले में)। यह आपको नहीं बताता कि उपयोगकर्ता टाइप कर सकता है (उदाहरण के लिए जब कोई हार्डवेयर कीबोर्ड हो)। यदि ऐप स्वयं अन्य विंडो बनाता है तो अन्य विंडो को देखना काम नहीं करता है।


IPad, कीबोर्ड में कीबोर्ड के बारे में अच्छी चेतावनी!
JOM

3

स्विफ्ट कार्यान्वयन:

class KeyboardStateListener: NSObject
{
  static var shared = KeyboardStateListener()
  var isVisible = false

  func start() {
    let nc = NSNotificationCenter.defaultCenter()
    nc.addObserver(self, selector: #selector(didShow), name: UIKeyboardDidShowNotification, object: nil)
    nc.addObserver(self, selector: #selector(didHide), name: UIKeyboardDidHideNotification, object: nil)
  }

  func didShow()
  {
    isVisible = true
  }

  func didHide()
  {
    isVisible = false
  } 
}

क्योंकि स्विफ्ट स्टार्टअप पर क्लास लोड विधि को निष्पादित नहीं करता है, इसलिए इस सेवा को ऐप लॉन्च पर शुरू करना महत्वपूर्ण है:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
  ...    
  KeyboardStateListener.shared.start() 
}

IOS 13, स्विफ्ट 5.0 का उपयोग करते हुए यह अंतिम बिट, वर्ग लोड आवश्यक नहीं लगता है?
15:30 बजे user3069232

3

यह मेरा समाधान है, यह सब कुछ एक ही स्थिर विधि में संलग्न करता है, और आप इसे कहीं भी जांचने के लिए कह सकते हैं:

+(BOOL)isKeyboardVisible{
    static id tokenKeyboardWillShow = nil;
    static id tokenKeyboardWillHide = nil;
    static BOOL isKbVisible = NO;
    @synchronized (self) {
        if (tokenKeyboardWillShow == nil){
            tokenKeyboardWillShow = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = YES;
                }
            }];
        }

        if (tokenKeyboardWillHide == nil){
            tokenKeyboardWillHide = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = NO;
                }
            }];
        }
    }

    return isKbVisible;
}

2

और यहाँ यह स्विफ्ट में कैसे करना है:

 func registerForKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWasShown:",
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWillBeHidden:",
        name: UIKeyboardWillHideNotification,
        object: nil)
}

func keyboardWasShown(notification: NSNotification) {
    println("Keyboard was shown");
}

func keyboardWillBeHidden(notification: NSNotification) {
    println("Keyboard was dismissed");
}

अपंजीकृत करने के लिए मत भूलना:

 override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardWillHideNotification,
        object: nil)
}

और यदि आप "रिटर्न" बटन दबाने पर कीबोर्ड को खारिज करना चाहते हैं:

class ViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    registerForKeyboardNotifications()
    yourTextField.delegate = self
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}

1

इस फ़ंक्शन का प्रयास करें

BOOL UIKeyboardIsVisible(){

BOOL keyboardVisible=NO;
// Locate non-UIWindow.
UIWindow *keyboardWindow = nil;
for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
    if (![[testWindow class] isEqual:[UIWindow class]]) {
        keyboardWindow = testWindow;
        break;
    }
}
// Locate UIKeyboard.
for (UIView *possibleKeyboard in [keyboardWindow subviews]) {
    // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView.
    if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"]) {
        keyboardVisible=YES;
    }
    if ([[possibleKeyboard description] hasPrefix:@"<UIKeyboard"]) {
        keyboardVisible=YES;
        break;
    }
}
return keyboardVisible;

}

से: iOS: `UIKeyboard` का उपयोग कैसे करें?



1

मौसम कीबोर्ड दिखाई देने के लिए, हम कीबोर्ड पूर्वनिर्धारित सूचनाओं का उपयोग कर सकते हैं।

UIKeyboardDidShowNotification, UIKeyboardDidHideNotification

उदाहरण के लिए मैं कीबोर्ड अधिसूचना को सुनने के लिए निम्न कोड का उपयोग कर सकता हूं

// कीबोर्ड दिखावे और गायब होने के लिए सुनो

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidHide:)
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

विधियों में मुझे सूचनाएं मिल सकती हैं

- (void)keyboardDidShow: (NSNotification *) notifyKeyBoardShow{
    // key board is closed
}

- (void)keyboardDidHide: (NSNotification *) notifyKeyBoardHide{
    // key board is opened
}

1

स्विफ्ट 4

extension UIViewController {
    func registerKeyboardNotifications() {
        let center = NotificationCenter.default
        center.addObserver(self, selector: #selector(keyboardWillBeShown(note:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
        center.addObserver(self, selector: #selector(keyboardWillBeHidden(note:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
    }

    func removeKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    }

    @objc
    func keyboardWillBeShown(note: Notification) {}

    @objc
    func keyboardWillBeHidden(note: Notification) {}

}

final class MyViewController: UIViewController {

    // MARK: - Properties
    var isKeyboardVisible = false

    // MARK: - Life Cycle
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        registerKeyboardNotifications()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        removeKeyboardNotifications()
    }

    // MARK: - Keyboard Handling
    override func keyboardWillBeShown(note: Notification) {
        isKeyboardVisible = true
        let userInfo = note.userInfo
        let keyboardFrame = userInfo?[UIKeyboardFrameEndUserInfoKey] as! CGRect
        let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardFrame.height, 0.0)
        tableView.contentInset = contentInset
    }

   override func keyboardWillBeHidden(note: Notification) {
        tableView.contentInset = .zero
        isKeyboardVisible = false
   }

   // MARK: - Test
   fileprivate func test() {
        if isKeyboardVisible { // do something
        }
   }
}

मेरे लिए बहुत अच्छी तरह से काम करता है (Xcode 10.2, Swift4) बस उत्सुक था कि किसी ने इसे क्यों नहीं उतारा?
infinity_coding7

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

0

आप यह देखने के लिए कि क्या कोई ऐसा पहला रेस्पोंडर है, किसी अभिभावक के साक्षात्कार में सभी पाठ्यपुस्तकों, टेक्स्टफील्ड्स, और लेबलों को पुनरावृत्त कर सकता है:

-(BOOL)isKeyboardActiveInView:(UIView *)view {
    for (UIView *anyView in [view subviews]) {
        if ([anyView isKindOfClass:[UITextField class]]) {
            if (((UITextField *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UILabel class]]) {
            if (((UILabel *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UITextView class]]) {
            if (((UITextView *)anyView).isFirstResponder) {
                return YES;
            }
        } else {
            if ([self isKeyboardActiveInView:anyView]) {
                return YES;
            }
        }
    }
    return NO;
}

यह विफल हो जाता है यदि आपके पास बाल दृश्य नियंत्रक हैं
रिकार्डो

-1

स्विफ्ट 4.2 / स्विफ्ट 5

class Listener {
   public static let shared = Listener()
   var isVisible = false

   // Start this listener if you want to present the toast above the keyboard.
   public func startKeyboardListener() {
      NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: UIResponder.keyboardWillShowNotification, object: nil)
      NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: UIResponder.keyboardWillHideNotification, object: nil)
   }

   @objc func didShow() {
     isVisible = true
   }

    @objc func didHide(){
       isVisible = false
    }
}

-5

मुझे लगता है कि इससे आपको मदद मिल सकती है,

+(BOOL)isKeyBoardInDisplay  {

    BOOL isExists = NO;
    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])   {
        if ([[keyboardWindow description] hasPrefix:@"<UITextEffectsWindow"] == YES) {
            isExists = YES;
        }  
    }

    return isExists;
}

धन्यवाद,

नवीन शान


1
IOS 6 पर, केवल कार्य अभी तक दिखाई नहीं दिया है! एक बार जब उन्हें एक बार कीबोर्ड दिखाया गया, तो उसका काम करना बंद हो गया।
जेम्स लॉरेनस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.