我目前正在我的应用程序中构建一些基本的表单功能,当点击另一个 TextField 或在编辑模式下按“完成”时,我遇到了 TextFields 没有更改相关绑定变量中的值的问题。
@Binding var jobDetails: JobDetails
@Environment(\.colorScheme) var colorScheme: ColorScheme
...
var body: some View {
...
HStack {
Text("Hourly Rate")
Spacer()
TextField("", value: $jobDetails.hourlyRateBasic, formatter: TextFormatters().currencyFormatter())
.keyboardType(.asciiCapableNumberPad)
.multilineTextAlignment(.trailing)
...
Run Code Online (Sandbox Code Playgroud)
在 iOS 模拟器中,该字段似乎仅在我输入新值(而不是模拟器中的软键盘)后物理按下键盘上的返回键时才会更新。我希望 TextFieldjobDetails.hourlyRateBasic在点击另一个 TextField 或按“完成”退出编辑模式时提交它的更改。
onEditingChanged当我点击另一个 TextField 时,似乎会触发,但我不知道如何利用它来更改jobDetails新值。
我正在尝试实现在编辑模式详细视图中更改货币值的功能,但我正在努力获得数值工作的格式化输入。
struct JobDetailView_Edit: View {
@State var jobDetails: JobDetails
var currencyFormatter: NumberFormatter = {
let f = NumberFormatter()
f.numberStyle = .currency
return f
}()
var body: some View {
Form {
Section(header: Text("General")) {
HStack {
Text("Job Name")
Spacer()
TextField($jobDetails.jobName)
.multilineTextAlignment(.trailing)
}
TextField($jobDetails.hourlyRateBasic, formatter: currencyFormatter)
}
... other unimportant code...
Run Code Online (Sandbox Code Playgroud)
数据正确传入,文本字段显示存储在 $jobDetails.hourlyRateBasic 中的格式化值,但是,我无法编辑该字段,因为如果它是一个字符串,我可以这样做。如果我尝试编辑该字段,然后在模拟器中按 Enter 键,则会收到以下错误消息:
[SwiftUI] Failure setting binding's value. The supplied formatter does not produce values of type Double. This may be resolved by ensuring the binding and the …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个主/详细信息类型的示例应用程序,并且我正在努力让 NavigationBar UI 在我的详细信息视图中正常工作。我正在处理的视图的代码如下:
struct JobDetailView : View {
var jobDetails: JobDetails
var body: some View {
Form {
Section(header: Text("General")) {
HStack {
Text("Job Name")
Spacer()
Text(jobDetails.jobName)
.multilineTextAlignment(.trailing)
}
HStack {
Text("Hourly Rate")
Spacer()
Text(TextFormatters().currencyString(amount: jobDetails.hourlyRateBasic!))
.multilineTextAlignment(.trailing)
}
}
} .padding(.top)
.navigationBarTitle(Text(jobDetails.jobName))
}
}
Run Code Online (Sandbox Code Playgroud)
原因.padding(.top)是向上滚动时停止表单与导航栏重叠。
导航栏上的白色背景部分是我的问题(第一张图片),我希望它与 UI 的整体风格保持一致,我希望发生的事情显示在第二张图片中。
我试图添加前景色/背景色和视图来改变这种颜色,但无济于事。我也不愿为 NagivationBar 强制使用颜色,因为这需要进一步配置才能与暗模式一起使用。
我正在尝试在 SwiftUI 中的 TextField 上实现 inputAccessoryView。目标是在键盘上方出现一个“完成”按钮,按下该按钮后即可摆脱键盘(即 resignFirstResponder())。
我遇到了以下 Medium 文章,该文章声称完全按照我的要求实施此行为,但是,我正在努力使其正常工作。
我试图在一个空白的 XCode 项目中实现这个,我的代码编译,但是,TextField 永远不会出现,我无法触摸应该调出键盘的区域。如何正确实现此代码以获得所需的行为?
import Foundation
import UIKit
import SwiftUI
class TextFieldViewController
: UIViewController {
// our custom text field will report changes to the outside
let text: Binding<String>?
// if the toolbar (see below) is used (Done), the keyboard shall be dismissed
// and optionally we execute a provided closure
let onDismiss: (() -> Void)?
init (
text: Binding<String>
, onDismiss: (() -> Void)?) {
self.text = …Run Code Online (Sandbox Code Playgroud)