কী-বোর্ডটি কখন দেখানো হয় এবং লুকানো হয় তা কীভাবে সনাক্ত করতে হয়


উত্তর:


168

কীবোর্ড সম্পর্কে বার্তা শোনার জন্য আপনার শ্রেণীর ভিউডিডলড পদ্ধতিতে সেট আপ করুন:

// Listen for keyboard appearances and disappearances
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

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

তারপরে আপনি নির্দিষ্ট পদ্ধতিগুলিতে (এই ক্ষেত্রে keyboardDidShowএবং keyboardDidHide) আপনি এটি সম্পর্কে কিছু করতে পারেন:

- (void)keyboardDidShow: (NSNotification *) notif{
    // Do something here
}

- (void)keyboardDidHide: (NSNotification *) notif{
    // Do something here
}

আপনি ক্ষেত্রের মাধ্যমে ট্যাব দিলে কাজ করে না। ভাবছেন যে এর সমাধান কী হবে এবং আপনি যদি কোনও আসল আইপ্যাডের মাধ্যমে ট্যাবও করতে পারেন?
i--

@ অ্যাপ্রেন্টাইস আপনি কী বোঝাতে চাইছেন যে আপনি ট্যাব দিলে কি-বোর্ডটি প্রদর্শিত হবে না?
ম্যাথু ফ্রেডরিক

যদি এখনও ফোকাস সহ একের নীচে কীবোর্ড দ্বারা আচ্ছাদিত ক্ষেত্রগুলি থাকে, কেবলমাত্র কীবোর্ডটি স্লাইড হওয়ার মুহুর্তে বিজ্ঞপ্তি প্রেরণের কারণে দৃশ্যটি ট্যাবটিতে থাকবে
i--

4
@ এপ্রেন্টাইস আপনাকে হাতের মাধ্যমে পরিচালনা করতে হবে, প্রতিটি পাঠ্য ক্ষেত্র সক্রিয় হয়ে ওঠার ভিত্তিতে স্ক্রোলভিউটি স্লাইড করে, কীবোর্ডটি কখন প্রদর্শিত হয় তা জানার চেয়ে আলাদা সমস্যা। আপনার দর্শন নিয়ন্ত্রককে একটি UITextFieldDelegatই করুন, তারপরে textFieldShouldReturn:পদ্ধতিটি কার্যকর করুন । আপনি textFieldযুক্তি হিসাবে সবেমাত্র প্রবেশ করবেন, যা আপনি নিজের টেক্সটফিল্ডগুলির সাথে তুলনা করতে এবং scrollViewউপযুক্ত টেক্সটফিল্ডটি প্রদর্শিত হচ্ছে যাতে স্ক্রোল করতে পারেন।
ম্যাথু ফ্রেডেরিক

95

আপনি শুধু প্রয়োজন হতে পারে addObserverমধ্যে viewDidLoad। কিন্তু থাকার addObserverমধ্যে viewWillAppearএবং removeObserverমধ্যে viewWillDisappearবাধা বিরল বিপর্যস্ত যা ঘটে যখন আপনি আপনার ভিউ পরিবর্তন হচ্ছে।

সুইফট 4.2

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillAppear() {
    //Do something here
}

@objc func keyboardWillDisappear() {
    //Do something here
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}

সুইফট 3 এবং 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: Notification.Name.UIKeyboardWillHide, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: Notification.Name.UIKeyboardWillShow, object: nil)
}

@objc func keyboardWillAppear() {
    //Do something here
}

@objc func keyboardWillDisappear() {
    //Do something here
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}

পুরানো সুইফট

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

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

func keyboardWillAppear(notification: NSNotification){
    // Do something here
}

func keyboardWillDisappear(notification: NSNotification){
    // Do something here
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

9
আপনি যদি ভিউইলডিস্পায়ারটিতে আপনার পর্যবেক্ষককে সরিয়ে থাকেন ... আপনার ভিউডিলডএডের পরিবর্তে ভিউইল অ্যাপয়ারে এটি যুক্ত করা উচিত।
ফৌজ

এটি সত্য, উত্তরটি সম্পাদনা করতে নির্দ্বিধায়। আমি এটি গ্রহণ করব
Esqarrouth

@ ফোউজ এইভাবে পর্যবেক্ষকদের অপসারণ করা ভাল deinit:deinit { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) }
ক্র্যাশলোট

সুইফ্ট 3-তে, উপরের ডিনিট কোড ব্লকের মতো:deinit { NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) }
মোঃ নাজমুল হাসান

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

19

সুইফট 3:

NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

func keyboardWillShow(_ notification: NSNotification){
    // Do something here
}

func keyboardWillHide(_ notification: NSNotification){
    // Do something here
}

9

সুইফট 4:

  NotificationCenter.default.addObserver( self, selector: #selector(ControllerClassName.keyboardWillShow(_:)),
  name: Notification.Name.UIKeyboardWillShow,
  object: nil)
  NotificationCenter.default.addObserver(self, selector: #selector(ControllerClassName.keyboardWillHide(_:)),
  name: Notification.Name.UIKeyboardWillHide,
  object: nil)

এরপরে, অবজেক্টের জীবন শেষ হয়ে গেলে বিজ্ঞপ্তিগুলি শোনা বন্ধ করার পদ্ধতি যুক্ত করা: -

Then add the promised methods from above to the view controller:
deinit {
  NotificationCenter.default.removeObserver(self)
}
func adjustKeyboardShow(_ open: Bool, notification: Notification) {
  let userInfo = notification.userInfo ?? [:]
  let keyboardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
  let height = (keyboardFrame.height + 20) * (open ? 1 : -1)
  scrollView.contentInset.bottom += height
  scrollView.scrollIndicatorInsets.bottom += height
}

@objc func keyboardWillShow(_ notification: Notification) {
  adjustKeyboardShow(true, notification: notification)
}
@objc func keyboardWillHide(_ notification: Notification) {
  adjustKeyboardShow(false, notification: notification)
}

উপস্থিতিগুলি +=পোকামাকড়গুলি আরও বড় এবং বৃহত করে তোলে appears
ওয়েজ

আমার মনে হয় অ্যাডজাস্টকিবোর্ডশো ফাংশনটি খুব সু-তৈরি ফাংশন। ধন্যবাদ.
হং বিকাশকারী

সুইফট 5 অনুসারে নোটিফিকেশন নামটি UIResponder.keyboardWillShowNotificationএবং UIResponder.keyboardWillHideNotification, এবং কীবোর্ড তথ্য কী UIResponder.keyboardFrameBeginUserInfoKey
কোডব্রু

7

সুইফট 5

উপরের উত্তরগুলি সঠিক। যদিও আমি গুটিয়ে রাখতে সহায়ক তৈরি করতে পছন্দ করব notification's observers

উপকার:

  1. প্রতিবার কীবোর্ড আচরণগুলি পরিচালনা করার সময় আপনাকে পুনরাবৃত্তি করতে হবে না।
  2. অন্যান্য এনাম মান প্রয়োগ করে আপনি অন্যান্য বিজ্ঞপ্তি প্রসারিত করতে পারেন
  3. আপনি যখন বিভিন্ন কন্ট্রোলারে কীবোর্ড নিয়ে কাজ করতে চান তখন এটি কার্যকর।

কোডের উদাহরণ:

extension KeyboardHelper {
    enum Animation {
        case keyboardWillShow
        case keyboardWillHide
    }

    typealias HandleBlock = (_ animation: Animation, _ keyboardFrame: CGRect, _ duration: TimeInterval) -> Void
}

final class KeyboardHelper {
    private let handleBlock: HandleBlock

    init(handleBlock: @escaping HandleBlock) {
        self.handleBlock = handleBlock
        setupNotification()
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    private func setupNotification() {
        _ = NotificationCenter.default
            .addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in
                self?.handle(animation: .keyboardWillShow, notification: notification)
            }

        _ = NotificationCenter.default
            .addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] notification in
                self?.handle(animation: .keyboardWillHide, notification: notification)
            }
    }

    private func handle(animation: Animation, notification: Notification) {
        guard let userInfo = notification.userInfo,
            let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
            let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double
        else { return }

        handleBlock(animation, keyboardFrame, duration)
    }
}

কিভাবে ব্যবহার করে:

private var keyboardHelper: KeyboardHelper?
...

override func viewDidLoad() {
   ...
   keyboardHelper = KeyboardHelper { [unowned self] animation, keyboardFrame, duration in
        switch animation {
        case .keyboardWillShow:
            print("keyboard will show")
        case .keyboardWillHide:
            print("keyboard will hide")
        }
    }

}


5

সুইফট - 4

override func viewWillAppear(_ animated: Bool) {
   super.viewWillAppear(animated)
   addKeyBoardListener()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self) //remove observer
}

func addKeyBoardListener() {
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil);
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil);
}

@objc func keyboardWillShow(_ notification: Notification) {

}

@objc func keyboardWillHide(_ notification: Notification) {

}

5

সুইফ্ট ৪.২-এ বিজ্ঞপ্তিগুলির নামগুলি একটি পৃথক নেমস্পেসে চলে গেছে। সুতরাং এখন এটি

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    addKeyboardListeners()
}


override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}


func addKeyboardListeners() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc private extension WhateverTheClassNameIs {

    func keyboardWillShow(_ notification: Notification) {
        // Do something here.
    }

    func keyboardWillHide(_ notification: Notification) {
        // Do something here.
    }
}

4

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


4

আপনি 2 টি কীবোর্ড বিজ্ঞপ্তির জন্য নিজেকে নিবন্ধিত করতে চাইবেন:

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

কীভাবে কীভাবে আপনার টেক্সটফিল্ডকে সমন্বয় করা যায় সে সম্পর্কে দুর্দান্ত পোস্ট - http://iosdevelopertips.com/user-interface/adjust-textfield-hided-by-keyboard.html


2

সুইফট 4 -dd 20 october 2017

override func viewDidLoad() {
    [..]

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
}

@objc func keyboardWillAppear(_ notification: NSNotification) {
    if let userInfo = notification.userInfo, 
       let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue).cgRectValue {
           let inset = keyboardFrame.height // if scrollView is not aligned to bottom of screen, subtract offset
           scrollView.contentInset.bottom = inset
           scrollView.scrollIndicatorInsets.bottom = inset
    }
}

@objc func keyboardWillDisappear(_ notification: NSNotification) {
    scrollView.contentInset.bottom = 0
    scrollView.scrollIndicatorInsets.bottom = 0
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

1

আপনার যদি আরও একটি থাকে UITextFieldএবং আপনার (বা তার আগে) কীবোর্ড প্রদর্শিত হবে বা অদৃশ্য হয়ে গেলে কিছু করা দরকার, আপনি এই পদ্ধতির প্রয়োগ করতে পারেন।

যোগ UITextFieldDelegateআপনার বর্গ করা। পূর্ণসংখ্যার কাউন্টার নির্ধারণ করুন, আসুন বলুন:

NSInteger editCounter; 

এই কাউন্টারটি কোথাও শূন্যে সেট করুন viewDidLoad। তারপরে, পদ্ধতিগুলি বাস্তবায়ন textFieldShouldBeginEditingএবং textFieldShouldEndEditingপ্রতিনিধিত্ব করুন।

প্রথমটিতে সম্পাদনা কাউন্টারে 1 যুক্ত করুন। এডিটকাউন্টারটির মান যদি 1 হয়ে যায় - এর অর্থ হ'ল কীবোর্ড প্রদর্শিত হবে (আপনি যদি YES ফেরত দেন তবে)। যদি সম্পাদনা কাউন্টার> 1 - এর অর্থ হ'ল কীবোর্ডটি ইতিমধ্যে দৃশ্যমান এবং অন্য একটি ইউআইটিেক্সটফিল্ড ফোকাসটি ধারণ করে।

সম্পাদনা textFieldShouldEndEditingকাউন্টার থেকে বিয়োগ 1 তে। আপনি যদি শূন্য পান - কীবোর্ড খারিজ করা হবে, অন্যথায় এটি স্ক্রিনে থাকবে।


0

আপনি KBKeyboardObserver লাইব্রেরি ব্যবহার করতে পারেন । এটিতে কয়েকটি উদাহরণ রয়েছে এবং এটি সহজ ইন্টারফেস সরবরাহ করে।



0

সুতরাং আহ, এটি এখন আসল উত্তর।

import Combine


class MrEnvironmentObject {
    /// Bind into yr SwiftUI views
    @Published public var isKeyboardShowing: Bool = false

    /// Keep 'em from deallocatin'
    var subscribers: [AnyCancellable]? = nil

    /// Adds certain Combine subscribers that will handle updating the
    ///  `isKeyboardShowing` property 
    ///
    /// - Parameter host: the UIHostingController of your views. 
    func setupSubscribers<V: View>(
        host: inout UIHostingController<V>
    ) {
        subscribers = [
            NotificationCenter
                .default
                .publisher(for: UIResponder.keyboardWillShowNotification)
                .sink { [weak self] _ in
                    self?.isKeyboardShowing = true
                },
            NotificationCenter
                .default
                .publisher(for: UIResponder.keyboardWillHideNotification)
                .sink { [weak self, weak host] _ in
                    self?.isKeyboardShowing = false
                    // Hidden gem, ask me how I know:
                    UIAccessibility.post(
                        notification: .layoutChanged, 
                        argument: host
                    )
                },
            // ...
            Profit
                .sink { [weak self] profit in profit() },
        ]
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.