আইওএস অ্যাপে একটি কীবোর্ড উপস্থিত আছে কি না তা আমি প্রোগ্রামগতভাবে পরীক্ষা করতে পারি?


111

আমার আইওএস অ্যাপ্লিকেশনটিতে কীবোর্ডের দৃশ্যমানতার শর্তটি আমাকে পরীক্ষা করতে হবে।

সুডোকোড:

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

আমি কীভাবে এই শর্তটি পরীক্ষা করতে পারি?


কি অ্যাপ্লিকেশন? কী ভাষা? কি প্ল্যাটফর্ম? আমার সেরা অনুমান আইফোন?
নিক বেডফোর্ড

4
প্রশ্ন স্থির। খেলা শুরু করা যাক!
রবার্ট হার্ভে

সম্ভবত এটি
পিটার ওং

উত্তর:


68

… বা সহজ উপায় নিন:

আপনি যখন কোনও পাঠ্য ফিল্ড প্রবেশ করেন, এটি প্রথম প্রতিক্রিয়াশীল হয়ে যায় এবং কীবোর্ডটি উপস্থিত হয়। আপনি কীবোর্ডের সাথে স্থিতি পরীক্ষা করতে পারেন [myTextField isFirstResponder]। যদি এটি ফিরে আসে YES, তবে কীবোর্ডটি সক্রিয় রয়েছে।


21
ভাল সমাধান, তবে এটি কার্যকর হবে না, যদি কোনও হার্ডওয়্যার কীবোর্ড ব্যবহার করা হয় (আইপ্যাডে অস্বাভাবিক নয়)।
আন্দ্রে হার্ফোর্ড

4
এটি প্রশ্নের উত্তর দেয় না। এটি আপনাকে জানিয়ে দেয় যদি পাঠ্য ক্ষেত্রটি প্রথম প্রতিক্রিয়াশীল হয়। আমার একাধিক চাইল্ড ভিউ কন্ট্রোলার সহ একটি ভিউ কন্ট্রোলার রয়েছে, যার সবগুলিতেই ইউআইটিেক্সটফিল্ড রয়েছে। এই পদ্ধতিটি ব্যবহার করে, আমি আমার পিতা-মাতার ভিউ কন্ট্রোলারের কাছ থেকে কীবোর্ডটি দেখানো হয়েছে কিনা তা বলতে পারি না। একমাত্র নির্ভরযোগ্য উপায় হ'ল অন্যান্য
উত্তরে

63

ড্রোনওয়ারওয়ার্ডের কোডটি খুব কাছাকাছি, তবে ইউআইকিট-এর নেমস্পেসের সাথে সংঘর্ষে এবং এটি ব্যবহার করা সহজতর করা যেতে পারে।

@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
কেন এটির নিজস্ব পুল দরকার?
ড্যান রোজনস্টার্ক 21

18
+loadএকটি বিশেষ পদ্ধতি যা অবজেক্টিভ-সি রানটাইম দ্বারা ডাকা হয়। অ্যাপ্লিকেশন বাইনারি লোড হওয়ার পরে এটি প্রতিটি শ্রেণীর জন্য ডাকা হয়, তবে main()ফাংশনটি প্রবেশের আগে । কোনও অটোরিলেজ পুলটি লাইভ হবে এমন কোনও গ্যারান্টি নেই।
রাপেরিচ

1
ম্যাটডিপ্যাস্কোয়েল: যদি + লোড পদ্ধতিটি মোছা হয় তবে শেয়ারড ইনস্ট্যান্স কখনই আরম্ভ করা হবে না। যেহেতু কোনও গ্যারান্টি নেই যে রানটাইম যখন একটি + লোড পদ্ধতির আবেদন করে তখন একটি অটোরিলেজ পুল সক্রিয় থাকে, তারা অটোরিলেজ কল করার ক্ষেত্রে সিস্টেম-সরবরাহিত ক্লাসগুলিতে সমস্ত কল মোড়ানো প্রয়োজন।
রাপেরিচ

3
চমৎকার উত্তর! আমি জানি এই কয়েক বছর বয়সী কিন্তু NSAutoreleasePool alloc/ releaseএখন কোড পার্শ্ববর্তী দ্বারা প্রতিস্থাপিত হতে পারে@autoreleasepool { }
chown

3
সম্ভবত কীবোর্ডস্টেটলাইস্টেনারের ডেলোকটিতে পর্যবেক্ষকটিকে সরাতে ভুলবেন না।
সুশীগ্রাস জ্যাকব

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/docamentation/UIKit/References/UITextField_Class/References/UITextField.html

কীবোর্ড বিজ্ঞপ্তি

সিস্টেমটি কীবোর্ডটি দেখায় বা লুকিয়ে রাখে, এটি বেশ কয়েকটি কীবোর্ড বিজ্ঞপ্তি পোস্ট করে। এই বিজ্ঞপ্তিগুলিতে কীবোর্ডের আকার সহ আরও তথ্য রয়েছে যা আপনি গণনাগুলির জন্য ব্যবহার করতে পারেন যা চলন্ত দর্শনগুলিতে জড়িত। এই বিজ্ঞপ্তিগুলির জন্য নিবন্ধকরণ হ'ল কীবোর্ড সম্পর্কে কিছু ধরণের তথ্য পাওয়ার একমাত্র উপায়। কীবোর্ড-সম্পর্কিত ইভেন্টগুলির জন্য সিস্টেমটি নিম্নলিখিত বিজ্ঞপ্তিগুলি সরবরাহ করে:

* UIKeyboardWillShowNotification
* UIKeyboardDidShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardDidHideNotification

এই বিজ্ঞপ্তিগুলি সম্পর্কে আরও তথ্যের জন্য, UIWindow শ্রেণির রেফারেন্সে তাদের বিবরণগুলি দেখুন। কী-বোর্ডটি কীভাবে দেখানো এবং লুকানো যায় সে সম্পর্কে তথ্যের জন্য, পাঠ্য এবং ওয়েব দেখুন see


আমি এই বিজ্ঞপ্তিটি চেক করেছি, তবে কীভাবে এই বিজ্ঞপ্তিগুলি চেক করতে হয় তা জানি না। আপনি যদি কিছু উদাহরণ পোস্ট করতে পারেন তবে এটি খুব সহায়ক হবে।
জিতেন্দ্র সিং

2
এনএসএনটিফিকেশন সেন্টারটি দেখুন। আপনার আগ্রহী বিজ্ঞপ্তিগুলির জন্য আপনাকে নিবন্ধন করতে হবে। আপনার আবেদনটি প্রস্থান করার সময় নিবন্ধন করতে ভুলবেন না।
টমাস মুলার

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
একটা deinit ব্যবহারে কোন বিন্দু যদি এটা একটা Singleton কারণ এটি deinited করা হবে না হয়
সাইরেন

11

কীবোর্ড প্রদর্শনের ইঙ্গিত হিসাবে উইন্ডো সাবভিউ হায়ারার্কি ব্যবহার হ্যাক। অ্যাপল যদি তাদের অন্তর্নিহিত বাস্তবায়ন পরিবর্তন করে তবে এই সমস্ত উত্তরগুলি ভঙ্গ হবে।

সঠিক উপায় হ'ল আপনার অ্যাপ্লিকেশন ডেলিগেটের অভ্যন্তরে বিজ্ঞপ্তি অ্যাপ্লিকেশনগুলিকে কীবোর্ড প্রদর্শন করা এবং গোপন রাখতে হবে:

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

এটি অ্যাপল দ্বারা প্রকাশিত আইওএস টেক্সট প্রোগ্রামিং গাইড থেকে এখানে এসেছে: https://developer.apple.com/library/ios/docamentation/StringsTextFouts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

আপনার ভিউডিডলডে মূলত "রেজিস্টারফোর্সকিবোর্ডনোটিকেশনস" কল করুন। তারপরে প্রতিবার কীবোর্ড সক্রিয় হওয়ার সাথে সাথে "কীবোর্ডওয়াসশাউন" ডাকা হয়। এবং প্রতিবার কীবোর্ড অদৃশ্য হয়ে গেলে, "কীবোর্ড উইলবিহিডেন" ডাকা হয়।

// 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 এ এই সমাধানটি অবশ্যই কাজ করে না। এটি প্রাথমিকভাবে আইওএস 4/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
@ জাজাহ অবশ্যই এটি সর্বজনীন পদ্ধতির নয় তবে এতে প্রচুর পরিমাণে প্রয়োগের মামলা রয়েছে। কীবোর্ড সম্পর্কে তথ্য পাওয়ার যে কোনও চেষ্টা কিছু নির্দিষ্ট দর্শন শ্রেণিবদ্ধ ব্যবহার করে কারণ অ্যাপল এই ক্ষেত্রে কোনও কার্যকর এপিআই সরবরাহ করে না।
ম্যালেক্স

এটি কাজ করে না, আমার জন্য যা কাজ করা হয়েছিল তা সমস্ত দর্শন এবং সমস্ত ইউআইটিেক্সটফিল্ড বা ইউআইটিেক্সটভিউ ভিউয়ের জন্য পুনরাবৃত্তি হয়েছিল যা তারা প্রথম প্রতিক্রিয়াশীল কিনা তা চেক করুন ... তারপরে যদি সত্যিকারের কীবোর্ডটি অন্য কোনও কিছুতে দৃশ্যমান হয় তবে তা নয়
amd

4

কয়েকটি পর্যবেক্ষণ:

সিঙ্গলটন অবজেক্টের জন্য প্রস্তাবিত প্যাটার্নটি নিম্নরূপ হবে। dispatch_once নিশ্চিত করে যে ক্লাসটি একবার থ্রেড-নিরাপদ উপায়ে আরম্ভ করা হয়েছে এবং স্থির ভেরিয়েবলটি বাইরে দৃশ্যমান নয়। এবং এটি স্ট্যান্ডার্ড জিসিডি, সুতরাং অবজেক্টিভ-সি এর নিম্ন স্তরের বিশদ সম্পর্কে জানতে হবে না।

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

    return shared;
}

সাধারণত আপনি কিবোর্ডটি দৃশ্যমান কিনা তা কেবল জানতে চান না তবে এটি কতটা বড়। কীবোর্ডগুলির সবার আকার একই থাকে না। আইফোন কীবোর্ডগুলি আইপ্যাড কীবোর্ডগুলির চেয়ে ছোট। সুতরাং আপনি @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];

কীবোর্ডটি দৃশ্যমান হওয়ার পরে যদি ব্যবহারকারী স্ক্রিনটি ঘোরান, অ্যাপ্লিকেশনটিকে বলা হবে যে কীবোর্ডটি লুকানো আছে, তারপরে আবার প্রদর্শিত হবে। যখন এটি প্রদর্শিত হয়, অন্যান্য দর্শনগুলি সম্ভবত এখনও ঘোরানো হয়নি। সুতরাং আপনি যদি কীবোর্ডের আড়াল / অনুষ্ঠানগুলি নিজেরাই পর্যবেক্ষণ করেন তবে আপনাকে যখন নির্দেশাবলীতে না প্রয়োজন স্থাবরগুলির রূপান্তর করুন

যদি ব্যবহারকারী কীবোর্ডটি বিভক্ত বা আনডক করে, বা একটি হার্ডওয়্যার কীবোর্ড ব্যবহার করে, বিজ্ঞপ্তিগুলি সর্বদা লুকানো হিসাবে কীবোর্ডটি প্রদর্শন করবে। কীবোর্ডটি আনডকিং বা মার্জ করা একটি "কিবোর্ড দেখানো" বিজ্ঞপ্তি প্রেরণ করবে।

কীবোর্ডটি লুকিয়ে থাকার সময় শ্রোতাকে অবশ্যই সূচনা করতে হবে, অন্যথায় প্রথম বিজ্ঞপ্তিটি মিস হবে এবং ধরে নেওয়া হবে যে কীবোর্ডটি এটি না থাকলে লুকানো আছে।

সুতরাং আপনি আসলে কী চান তা জানা বেশ গুরুত্বপূর্ণ। এই কোডটি কীবোর্ডের বাইরে জিনিসগুলি সরানোর জন্য কার্যকর (একটি বিভক্ত বা আনডকৃত কীবোর্ড সহ, এটি ব্যবহারকারীর দায়িত্ব)। এটি ব্যবহারকারী আপনাকে স্ক্রিনে একটি কীবোর্ড দেখতে পাবে কিনা (বিভক্ত কীবোর্ডের ক্ষেত্রে) তা আপনাকে জানায় না। এটি ব্যবহারকারী আপনাকে টাইপ করতে পারে কিনা তা উদাহরণ দেয় না (উদাহরণস্বরূপ যখন একটি হার্ডওয়্যার কীবোর্ড থাকে)। অ্যাপ্লিকেশন নিজেই অন্য উইন্ডোজ তৈরি করে তবে অন্যান্য উইন্ডোগুলি দেখার পক্ষে কাজ করে না।


থ্যাঙ্কস, আইপ্যাডে কীবোর্ড সম্পর্কে ভাল সতর্কতা!
জেএম

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() 
}

আইওএস 13 ব্যবহার করুন, এই শেষ বিট 5.0 টি দ্রুত করুন, বর্গ লোড প্রয়োজনীয় বলে মনে হচ্ছে না?
ব্যবহারকারী 3069232

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;

}

থেকে: আইওএস: কীভাবে `UIKeyboard` অ্যাক্সেস করবেন?



1

আবহাওয়ার কীবোর্ড প্রদর্শিত হয়েছে তা যাচাই করতে, আমরা কিবোর্ড পূর্বনির্ধারিত বিজ্ঞপ্তিগুলি ব্যবহার করতে পারি।

UIKeyboardDidShowNotifications, UIKeyboardDidHideNotifications

উদাহরণস্বরূপ আমি কীবোর্ড বিজ্ঞপ্তি শুনতে নিম্নলিখিত কোডটি ব্যবহার করতে পারি

// কীবোর্ড উপস্থিতি এবং অন্তর্ধানের জন্য শুনুন

[[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
        }
   }
}

আমার জন্য খুব ভাল কাজ করে (এক্সকোড 10.2, সুইফট 4) কেবল কৌতূহল কেন কেউ এটিকে অগ্রাহ্য করেনি?
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
আইওএস 6 এ, কেবলমাত্র কাজগুলি এখনও উপস্থিত হয়নি! একবার তাদের কীবোর্ড একবার প্রদর্শিত হয়ে গেলে, এটি কাজ করা বন্ধ করে দেয়।
জেমস লরেনস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.