ฉันจะตรวจจับได้อย่างไรเมื่อแป้นพิมพ์แสดงและซ่อนจากแอปพลิเคชันของฉัน
ฉันจะตรวจจับได้อย่างไรเมื่อแป้นพิมพ์แสดงและซ่อนจากแอปพลิเคชันของฉัน
คำตอบ:
ในเมธอด ViewDidLoad ของชั้นเรียนของคุณตั้งค่าให้ฟังข้อความเกี่ยวกับแป้นพิมพ์:
// 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
}
UITextFieldDelegat
e จากนั้นใช้textFieldShouldReturn:
วิธีการ คุณจะได้รับtextField
เพียงแค่ป้อนเป็นอาร์กิวเมนต์ซึ่งคุณสามารถเปรียบเทียบกับฟิลด์ข้อความของคุณเองและเลื่อนscrollView
เพื่อให้ฟิลด์ข้อความที่เหมาะสมแสดง
คุณก็อาจจะต้องอยู่ในaddObserver
viewDidLoad
แต่มีaddObserver
ในviewWillAppear
และremoveObserver
ในviewWillDisappear
การป้องกันการเกิดปัญหาที่หายากที่เกิดขึ้นเมื่อคุณกำลังจะเปลี่ยนมุมมองของคุณ
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)
}
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)
}
deinit
แบบนี้:deinit { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) }
deinit { NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) }
Swift 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
}
Swift 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)
}
+=
ปรากฏขึ้นเพื่อให้ขุ่นได้รับมีขนาดใหญ่และมีขนาดใหญ่
UIResponder.keyboardWillShowNotification
และและคีย์ข้อมูลแป้นพิมพ์เป็นUIResponder.keyboardWillHideNotification
UIResponder.keyboardFrameBeginUserInfoKey
มีคำตอบด้านบนที่ถูกต้อง แม้ว่าฉันต้องการสร้างตัวช่วยในการสรุปไฟล์notification's observers
.
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")
}
}
}
สวิฟต์ - 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) {
}
ใน Swift 4.2 ชื่อการแจ้งเตือนได้ย้ายไปยังเนมสเปซอื่น ตอนนี้มันเป็น
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.
}
}
ดูส่วนการจัดการแป้นพิมพ์ของ "ข้อความเว็บและคู่มือการเขียนโปรแกรมแก้ไข" สำหรับข้อมูลเกี่ยวกับการติดตามแป้นพิมพ์ที่แสดงหรือซ่อนอยู่และวิธีการแสดง / ปิดด้วยตนเอง
คุณจะต้องลงทะเบียนด้วยตัวคุณเองสำหรับการแจ้งเตือน 2 แป้นพิมพ์:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (keyboardDidHide:) name: UIKeyboardDidHideNotification object:nil];
โพสต์ที่ยอดเยี่ยมเกี่ยวกับวิธีปรับ TextField เป็นแป้นพิมพ์ - http://iosdevelopertips.com/user-interface/adjust-textfield-hidden-by-keyboard.html
สวิฟต์ 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)
}
หากคุณมีมากกว่าหนึ่งชิ้นUITextField
และคุณจำเป็นต้องทำบางอย่างเมื่อแป้นพิมพ์ (หรือก่อนหน้า) ปรากฏขึ้นหรือหายไปคุณสามารถใช้แนวทางนี้ได้
เพิ่มUITextFieldDelegate
ในชั้นเรียนของคุณ กำหนดตัวนับจำนวนเต็มสมมติว่า:
NSInteger editCounter;
viewDidLoad
ตั้งค่าตัวนับนี้ให้เป็นศูนย์แห่งหนึ่งใน จากนั้นนำไปใช้textFieldShouldBeginEditing
และtextFieldShouldEndEditing
มอบหมายวิธีการ
ในอันแรกให้เพิ่ม 1 ใน editCounter ถ้าค่าของ editCounter กลายเป็น 1 - หมายความว่าคีย์บอร์ดจะปรากฏขึ้น (ในกรณีที่คุณส่งคืน YES) หาก editCounter> 1 - หมายความว่าแป้นพิมพ์สามารถมองเห็นได้แล้วและ UITextField อื่นจะจับโฟกัส
ในการtextFieldShouldEndEditing
ลบ 1 จาก editCounter หากคุณได้ศูนย์ - แป้นพิมพ์จะถูกปิดมิฉะนั้นจะยังคงอยู่บนหน้าจอ
คุณสามารถใช้ไลบรารีKBKeyboardObserver ประกอบด้วยตัวอย่างบางส่วนและมีอินเทอร์เฟซที่เรียบง่าย
มี CocoaPods เพื่ออำนวยความสะดวกในการสังเกตNSNotificationCentr
สำหรับการมองเห็นแป้นพิมพ์ที่นี่: https://github.com/levantAJ/Keyhi
pod 'Keyhi'
อ่านี่คือคำตอบที่แท้จริงในตอนนี้
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() },
]
}
}