xcode - 当键盘可见/不可见时显示/隐藏 navigationBarItems | SwiftUI

标签 xcode list navigation swiftui

我花了很多时间研究和使用不同的代码来完成这项工作,但似乎无法弄清楚。下面你会看到两段代码,一段是我创建“完成”栏按钮项,另一段是检查键盘是否存在,并在单击按钮时关闭它。我遇到的一个问题是,我只希望栏按钮在键盘出现时显示。我希望在键盘消失后或者甚至在首先打开键盘之前隐藏条形按钮。你现在如何使用 SwiftUI 做到这一点?

.navigationBarItems(trailing:
            Button(action: {
                if UIApplication.shared.isKeyboardPresented {
                    UIApplication.shared.endEditing()
                }
            }, label: {
                Text("Done")
            })

extension UIApplication {
    func endEditing() {
        sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
    /// 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
        }
    }
}

最佳答案

作为一个选项,您可以定义一个对象来监听键盘通知:

class KeybordManager: ObservableObject {
    static let shared = KeybordManager()

    @Published var keyboardFrame: CGRect? = nil

    init() {
        let notificationCenter = NotificationCenter.default
        notificationCenter.addObserver(self, selector: #selector(willHide), name: UIResponder.keyboardWillHideNotification, object: nil)
        notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    }

    @objc func willHide() {
        self.keyboardFrame = .zero
    }

    @objc func adjustForKeyboard(notification: Notification) {
        guard let keyboardValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }

        let keyboardScreenEndFrame = keyboardValue.cgRectValue
        self.keyboardFrame = keyboardScreenEndFrame
    }
}

然后在您的 View 中订阅 keyboardFrame 更新并相应地显示和隐藏 Done 按钮:

public struct ContentView: View {

    @State private var showDoneButton = false
    @State private var text = ""

    public var body: some View {
        NavigationView {
            TextField("Some text", text: $text)
            .navigationBarItems(trailing:
                Group {
                    if self.showDoneButton {
                        Button(action: {
                            UIApplication.shared.endEditing()
                        }, label: {
                            Text("Done")
                        })
                    } else {
                        EmptyView()
                    }
            }

            )
                .onReceive(KeybordManager.shared.$keyboardFrame) { keyboardFrame in
                    if let keyboardFrame = keyboardFrame, keyboardFrame != .zero {
                        self.showDoneButton = true
                    } else {
                        self.showDoneButton = false
                    }
            }
        }
    }
}

extension UIApplication {
    func endEditing() {
        sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}

关于xcode - 当键盘可见/不可见时显示/隐藏 navigationBarItems | SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383632/

相关文章:

ios - 在 XCode 和 IOS 7 中移动文件

c++ - std::list::sort 和指向元素的指针

css - 如何让div的高度占满空间?

iphone - 音量硬件按钮输入

c++ - C++ 中的彩色输出

ios - 不兼容的库版本 : XXX requires version 2. 0.0 或更高版本,但 Runes 提供版本 1.0.0

java - 如何使用 WebDriver 和 Java 制作 "background-image"CSS 列表

python - 过滤数组以显示特定列中具有特定值的行

html - li 元素的导航和文本

c# - 使用导航时将值从另一个页面传递到 Silverlight 中的 MainPage.xaml?