我有一个依赖于视图模型的 swiftui 视图,视图模型有一些已发布的属性。我想为视图模型层次结构定义一个协议和默认实现,并使视图依赖于协议而不是具体类?
我希望能够写出以下内容:
protocol ItemViewModel: ObservableObject {
@Published var title: String
func save()
func delete()
}
extension ItemViewModel {
@Published var title = "Some default Title"
func save() {
// some default behaviour
}
func delete() {
// some default behaviour
}
}
struct ItemView: View {
@ObservedObject var viewModel: ItemViewModel
var body: some View {
TextField($viewModel.title, text: "Item Title")
Button("Save") { self.viewModel.save() }
}
}
// What I have now is this:
class AbstractItemViewModel: ObservableObject {
@Published var …Run Code Online (Sandbox Code Playgroud) 我有一个使用@FetchRequest从CoreData中显示对象的列表,我想为用户提供一个条形按钮,单击该按钮将过滤显示的列表。如何更改@FetchRequest谓词并动态地重新运行它,以使用过滤后的项目重建列表?
struct EmployeeListView : View {
@FetchRequest(
entity: Department.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Department.name, ascending: false)],
)
var depts: FetchedResults<Department>
@Environment(\.managedObjectContext) var moc
var body: some View {
NavigationView {
List {
ForEach(depts, id: \.self) { dept in
Section(header: Text(dept.name)) {
ForEach(dept.employees, id: \.self) { emp in
Text(emp.name)
}
}
}
}
.navigationBarTitle("Employees")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何提供过滤器,我不知道如何更改属性包装器谓词并重新运行获取请求。
我有一个显示玩家列表的 SwiftUI 导航视图。我设计的视图模型协议如下。
protocol PlayerListStateProviding: ObservableObject {
var players: [PlayerModel] { get set }
}
protocol PlayerListDeleting {
var moc: NSManagedObjectContext { get set }
func delete(at indexSet: IndexSet)
}
extension PlayerListDeleting where Self: PlayerListStateProviding {
func delete(at indexSet: IndexSet) {
moc.delete(players.remove(at: indexSet.first!))
objectWillChange.send() // this doesn't compile with the following error "Value of type 'Self.ObjectWillChangePublisher' has no member 'send'"
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这个错误是什么以及如何避免它。但是,当我删除扩展并创建具体类时,我可以毫无问题地发送信号。
假设我有一个 swiftui 视图显示按部门划分的员工列表,如何删除部分中的项目?以同样的方式向左滑动以删除 uitableview 中的行为。
import SwiftUI
struct ContentView: View {
var data: [String : [String]] = ["DeptA": ["EmpA", "EmpB", "EmpC"], "DeptB": ["EmpD", "EmpE", "EmpF"]]
var body: some View {
NavigationView {
List {
ForEach(data.keys.map { String($0) }, id: \.self) { dept in
Section(header: Text(dept)) {
ForEach(self.data[dept]!, id: \.self) { emp in
Text(emp)
}.onDelete(perform: self.deleteEmp)
}
}
}
.navigationBarTitle("Employees")
}
}
private func deleteEmp(indexSet: IndexSet) {
print(indexSet.first!)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView() …Run Code Online (Sandbox Code Playgroud) 我有一个简单的HStack包含 2 个Text显示计时器的结构。当定时器值改变时,它会不断改变位置。有没有办法避免这种行为。
struct DurationLabel: View {
let majorDuration: String // the hours/minutes part "00:00"
let minorDuration: String // the seconds part "00"
var body: some View {
HStack(spacing: 0) {
Text(majorDuration + minorDuration)
.font(.system(size: 90))
Text(minorDuration)
.font(.body)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何创建一个swiftui文本字段,允许用户仅输入数字和单个点?换句话说,它在用户输入时逐位检查数字,如果输入是数字或点,并且文本字段没有其他点,则接受该数字,否则将忽略该数字条目。不能使用步进器。