gpt4 book ai didi

ios - 带有 TextField 的 SwiftUI 列表在键盘出现/消失时进行调整

转载 作者:行者123 更新时间:2023-11-29 05:17:23 26 4
gpt4 key购买 nike

我用 SwiftUI 编写了一个列表。我还有一个用作搜索栏的 TextField 对象。我的代码如下所示:

import SwiftUI

struct MyListView: View {
@ObservedObject var viewModel: MyViewModel

@State private var query = ""

var body: some View {

NavigationView {
List {
// how to listen for changes here?
// if I add onEditingChange here, Get the value only after the user finish search (by pressing enter on the keyboard)
TextField(String.localizedString(forKey: "search_bar_hint"), text: self.$query) {
self.fetchListing()
}

ForEach(viewModel.myArray, id: \.id) { arrayObject in
NavigationLink(destination: MyDetailView(MyDetailViewModel(arrayObj: arrayObject))) {
MyRow(arrayObj: arrayObject)
}
}
}
.navigationBarTitle(navigationBarTitle())
}
.onAppear(perform: fetchListing)
}

private func fetchListing() {
query.isEmpty ? viewModel.fetchRequest(for: nil) : viewModel.fetchRequest(for: query)
}

private func navigationBarTitle() -> String {
return query.isEmpty ? String.localizedString(forKey: "my_title") : query
}
}

我现在遇到的问题是列表保留在键盘后面:(。我如何设置列表填充底部或边缘插入(或其他有效的,我完全打开),以便列表的滚动在上面结束键盘?列表“大小”也应该根据键盘是否打开或关闭自动调整。

问题如下:

enter image description here

请帮我提供任何建议,我真的不知道该怎么做:(。我是一个 SwiftUI 初学者,正在尝试学习它:)。

最佳答案

您可以尝试以下方法并自行添加详细的动画。

@ObservedObject var keyboard = KeyboardResponder()
var body: some View {

NavigationView {

List {
// how to listen for changes here?
// if I add onEditingChange here, Get the value only after the user finish search (by pressing enter on the keyboard)
TextField("search_bar_hint", text: self.$query) {
self.fetchListing()
}

ForEach(self.viewModel, id: \.self) { arrayObject in
Text(arrayObject)
}

}.padding(.bottom, self.keyboard.currentHeight).animation(.easeIn(duration: self.keyboard.keyboardDuration))
.navigationBarTitle(self.navigationBarTitle())
}
.onAppear(perform: fetchListing)
}





class KeyboardResponder: ObservableObject {
@Published var currentHeight: CGFloat = 0
@Published var keyboardDuration: TimeInterval = 0
private var anyCancellable: Set<AnyCancellable> = Set<AnyCancellable>()

init() {
let publisher1 = NotificationCenter.Publisher(center: .default, name: UIResponder.keyboardWillShowNotification).map{ notification -> Just<(CGFloat, TimeInterval)> in
guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {return Just((CGFloat(0.0), 0.0)) }
guard let duration:TimeInterval = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return Just((CGFloat(0.0), 0.0)) }
return Just((keyboardSize.height, duration))}

let publisher2 = NotificationCenter.Publisher(center: .default, name: UIResponder.keyboardWillHideNotification) .map{ notification -> Just<(CGFloat, TimeInterval)> in
guard let duration:TimeInterval = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return Just((CGFloat(0.0), 0.0)) }
return Just((0.0, duration))}

Publishers.Merge(publisher1, publisher2).switchToLatest().subscribe(on: RunLoop.main).sink(receiveValue: {
if $0.1 > 1e-6 { self.currentHeight = $0.0 }
self.keyboardDuration = $0.1
}).store(in: &anyCancellable)
}
}

关于ios - 带有 TextField 的 SwiftUI 列表在键盘出现/消失时进行调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com