@FetchRequest - использование NSPredicate - только принятие - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь отфильтровать @FetchRequest с помощью NSPredicate. Это работает как требуется, когда я передаю строку напрямую NSPredicate(format: "type == 'test'") Тем не менее, когда я передаю переменную, Xcode жалуется. Заранее спасибо.

Работает нормально Works fine

Не работает enter image description here

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Поместите запрос на выборку внутри

init (filter: String) {ваш запрос на выборку}

, затем вызовите AddSetView (filter: yourFilter)

Я недавно что-то сделал аналогичные эксперименты со SwiftUI. В моем случае пользователь создает категорию, и когда выбирается выбранная категория, я перечисляю элементы todo, указывающие c на категорию. Поэтому мне нужно отфильтровать результаты по выбранной категории. Мой код выглядит следующим образом, надеюсь, это поможет:

struct TodoList: View {
    @Environment(\.managedObjectContext) var context

    var fetchRequest: FetchRequest<Todo>

    init(filter: String) {
        fetchRequest = FetchRequest<Todo>(entity: Todo.entity(), sortDescriptors:[
            NSSortDescriptor(keyPath: \Todo.dateCreated, ascending: true)
        ], predicate: NSPredicate(format: "parentCategory.title == %@", filter))
    }

Я называю представление следующим образом:

TodoList(filter: selectedCategory.title!)

Последний кусок головоломки заключался в добавлении переменной в расширение в мой Todo + CoreDataProperties.swift

Я нашел решение для расширения на Hacking With Swift. https://www.hackingwithswift.com/books/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui

var wrappedTodo: String {
    parentCategory?.title ?? ""

}

Мне пришлось установить для моего основного объекта данных codegen значение Manual / None, а затем создать подклассы NSManagedObject. Первоначально это дало всевозможные ошибки, поэтому мне пришлось удалить мою модель. Создайте новый, установите кодовый код для каждого объекта на ручной / нет. Затем создайте подклассы NSManagedObject («Редактор»> «Создать подкласс NSManagedObject»). Затем я смог собрать без ошибок. После этого вы сможете редактировать файл (Entity) + CoreDataProperties.swift.

0 голосов
/ 31 марта 2020

Я нашел очень хорошее объяснение, с примером кода на Paul Hudsons, опубликованном c ресурсе Hacking with Swift Web Site.

https://www.hackingwithswift.com/books/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui

0 голосов
/ 29 марта 2020

Ошибка говорит о том, что вы не можете получить доступ к переменной filter (которая равна self.filter) в вашем методе init.

Это весь ваш код? Если строка @FetchRequest находится в вашем методе init, переместите ее после super.init () или переместите в метод, который выполняется после выполнения init ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...