我正在创建一个日志(log)应用程序,它会鼓励用户在早报部分至少写100个字符.我想通过在TextEditor的底部放置一个ProgressView来实现这一点.然后,根据用户的输入,进度条将从0%变为100%,如果他们写的字符超过100个,则保持在100%.进度条指示创建条目所需的最小字符数.
import SwiftUI
import Combine
struct AddNewEntryView: View {
@Environment(\.dismiss) var dismiss
@EnvironmentObject var data : JournalEntriesData
@State var typeOfNewEntry : EntryType
@State var newEntry : Entry
@State var progressValue: Double = 0.0
let MIN_ENTRY_CHARS = 10
let detector = PassthroughSubject<Void, Never>()
let publisher: AnyPublisher<Void, Never>
init(entryType: EntryType) {
_typeOfNewEntry = State(initialValue: entryType)
_newEntry = State(initialValue: Entry(type: entryType, text: ""))
publisher = detector
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.eraseToAnyPublisher()
}
func limitTo(num: Double, maxNum: Double) -> Double {
return num > maxNum ? maxNum : num
}
private func updateProgressBar() {
print("char count", newEntry.text.count)
progressValue = Double(newEntry.text.count / MIN_ENTRY_CHARS)
}
var body: some View {
VStack {
Form {
Text(newEntry.created, style: .date)
.font(.headline)
Section("Entry") {
TextEditor(text: $newEntry.text)
.foregroundColor(.secondary)
.padding(.horizontal)
.frame(minHeight: 80)
.onChange(of: newEntry.text) { _ in detector.send() }
.onReceive(publisher) { updateProgressBar()
}
}
ProgressView("Character count", value: $progressValue, total: 1.0)
}
}
.toolbar {
ToolbarItem {
Button("Add") {
data.entries.append(newEntry)
dismiss()
}
}
}
}
}
struct AddNewEntryView_Previews: PreviewProvider {
static var previews: some View {
AddNewEntryView(entryType: .MORNING_PAGES)
}
}
我现在几乎就知道了,但我的ProgressView告诉我,它无法将类型Double的值转换为预期的参数类型绑定,但我已经在那里使用了美元符号.它还在第二个错误中指出,初始值设定项(在它的value total中)要求绑定符合"BinaryFloatingPoint".我刚接触Swift ,在这里打字时有点迷路.