我正在创建一个日志(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 ,在这里打字时有点迷路.

推荐答案

您不需要绑定,所以修复可能很简单

ProgressView("Character count", value: progressValue, total: 1.0)

但你有复杂的解决方案,我建议只使用onChange来考虑更简单的解决方案("因为这个计算很快,可以直接应用进度,没有发布者).以及在添加新条目后直接重置progressValue.

这里是简化的演示.使用Xcode 13.4/iOS 15.5测试

struct DemoView: View {
    @State private var text = ""
    @State private var progressValue: Double = 0
    var body: some View {
        VStack {
            Form {
                Section("Entry") {
                    TextEditor(text: $text)
                        .foregroundColor(.secondary)
                        .padding(.horizontal)
                        .frame(minHeight: 80)
                        .onChange(of: text) { value in
                            if value.count <= 100 {
                                progressValue = Double(value.count) / 100.0
                            }
                        }
                }
                ProgressView("Character count", value: progressValue)
            }
        }
    }
}

Ios相关问答推荐

在SwiftData中从@ Query创建可排序、有序和分组的数据

在某些情况下,UIHostingController在自动调整时不能调整大小

如何从Windows PC在iPhone上安装Flutter 应用程序

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

SwiftData共享扩展阻止应用程序打开SQLite文件

clang:错误:SDK 路径中不包含libarclite

Swift locationManager.requestWhenInUseAuthorization() 不提示用户

SwiftUI - TextField - 在焦点上清除 Double 类型的值,在取消 Select 时恢复

SwiftUI 图表 BarMark 将注释对齐到图表顶部

具有线性渐变的 SVG textPath 在 Safari 中损坏

添加到单个自定义视图时,Swiftui 项目会在所有视图中重复

如何在不同设备的segment控制中管理文本大小(text size)?

通过按钮打开 AppStore

如何 comments .plist 文件中的行?

如何使用 Swift 从assets资源 中加载特定图像

在 Xcode 5 中为超级视图添加间距约束

判断密钥是否存在于 NSDictionary 中

如何在 Objective-C (iOS) 中的图像上写文本?

如何防止 iOS 设备上的显示屏变暗和关闭?

如何在 iphone 屏幕中间显示活动指示器?