Как использовать NSPredicate с NSPredicateEditor для разных данных (несколько предикатов?)

У меня есть массив путей к файлам, и в моем пользовательском интерфейсе есть настройка NSPredicateEditor, где пользователь может объединить NSPredicate для поиска файла. Он должен уметь фильтровать по имени, типу, размеру и дате.

У меня есть несколько проблем:

  • Я могу получить только один объект предиката от редактора. Когда я использую "ForexateForRow:", он возвращает (NULL)
  • Если пользователь хочет отфильтровать файл по имени И размеру или дате, я больше не могу просто использовать этот предикат в моем массиве, потому что эта информация не содержится в нем

Могу ли я разделить предикат на разные предикаты, не преобразовывая его в объект NSString, а затем выполнить поиск каждого @"ИЛИ" | @"И" и разделение компонентов в массив, а затем преобразование каждой строки NSString в новый предикат?


В настройках NSPredicateEditor у меня есть несколько вариантов для "левого выражения": ключевые пути, постоянные значения, строки, целые числа, числа с плавающей запятой и даты. Я хочу отобразить выпадающее меню для пользователя с "имя", "тип", "дата", "размер". Но тогда сгенерированный предикат автоматически выглядит так:

"name" MATCHES[c] "nameTest" OR "type" MATCHES[c] "jpg" OR size == 100

Поскольку массив заполнен строками, поиском "name", "type" и т. Д., И эти строки не отвечают на @"myString"*. Name * m, фильтр всегда возвращает 0 объектов. Есть ли способ показать имя, тип, размер и дату в меню, но написать "я" в предикат, не делая это вручную?

Я уже искал в официальных руководствах Apple, в Stackru, Google и даже на Youtube, чтобы найти подсказку. Эта проблема беспокоит меня уже почти неделю. Спасибо за ваше время! Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

1 ответ

Решение

Вы пришли в нужное место!:)

Я могу получить только один объект предиката от редактора.

Правильный. Это NSPredicateEditorне NSPredicatesEditor,;)

Когда я использую "Предикат для Row:" он возвращает (null)

Я не уверен, что использовал бы этот метод. Мое общее правило - в значительной степени игнорировать это NSPredicateEditor это подкласс NSRuleEditorглавным образом потому, что это настолько узкоспециализированный подкласс, что многие из методов суперкласса не имеют особого смысла в редакторе предикатов (как и все, что связано с критериями, выбором строк и т. д.). Возможно, они как-то актуальны, но если да, то я еще не понял, как это сделать.

Чтобы получить предикат от редактора, вы делаете:

NSPredicate *predicate = [myPredicateEditor objectValue];

Если пользователь хочет отфильтровать файл по имени И размеру или дате

Ты имеешь в виду (name = [something]) AND (size = [something] OR date = [something])?

Если так, NSPredicateEditor может сделать это, если вы установили режим вложенности "Соединение".

Я не могу больше использовать этот предикат в моем массиве, потому что эта информация не содержится в нем

Какая информация вам нужна?

Могу ли я разделить предикат на разные предикаты, не преобразовывая его в объект NSString, а затем выполнить поиск каждого @"ИЛИ" | @"И" и разделение компонентов в массив, а затем преобразование каждой строки NSString в новый предикат?

Да, но это плохая идея. Это плохо, потому что NSPredicate уже содержит всю необходимую вам информацию, и преобразование ее в другой формат и выполнение строковых манипуляций просто не требуется и может привести к сложностям (например, если кто-то может ввести значение для "имени", что произойдет, если они введут " ИЛИ ЖЕ "?).

Я с трудом пытаюсь понять, что ты пытаешься сделать. Похоже, у вас есть массив NSString объекты, которые вы хотите фильтровать на основе предиката, который создает пользователь? Если так, то что они делают name, date, а также size ключевые пути означают? Что ты пытаешься сделать?

Другие вопросы по тегам