小编M.S*_*rag的帖子

如何将协议定义为@ObservedObject 属性的类型?

我有一个依赖于视图模型的 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)

protocols swiftui

23
推荐指数
5
解决办法
6156
查看次数

如何根据用户输入使用新谓词重新运行@FetchRequest?

我有一个使用@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)

我知道如何提供过滤器,我不知道如何更改属性包装器谓词并重新运行获取请求。

nsfetchrequest swiftui

6
推荐指数
1
解决办法
282
查看次数

我正在尝试在协议扩展中使用“objectWillChange.send()”,但它不起作用,知道为什么吗?

我有一个显示玩家列表的 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)

我不确定这个错误是什么以及如何避免它。但是,当我删除扩展并创建具体类时,我可以毫无问题地发送信号。

protocols swiftui

5
推荐指数
1
解决办法
388
查看次数

如何删除由动态部分组成的 swiftui 列表中的项目?

假设我有一个 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)

swift swiftui

3
推荐指数
1
解决办法
3374
查看次数

有没有办法在显示计时器时防止 SwiftUI 文本标签稍微移动?

我有一个简单的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)

演示 GIF

swift swiftui

3
推荐指数
2
解决办法
478
查看次数

如何创建只接受数字和单个点的SwiftUI TextField?

如何创建一个swiftui文本字段,允许用户仅输入数字和单个点?换句话说,它在用户输入时逐位检查数字,如果输入是数字或点,并且文本字段没有其他点,则接受该数字,否则将忽略该数字条目。不能使用步进器。

textfield ios swiftui

1
推荐指数
1
解决办法
549
查看次数

标签 统计

swiftui ×6

protocols ×2

swift ×2

ios ×1

nsfetchrequest ×1

textfield ×1