NSPredicateEditor в Xcode 4

Немного проблем с элементами управления редактора предикатов в Xcode 4 - я думаю, что я все делаю правильно, и кажется, что сама среда IDE обанкротилась.

У меня есть эта проблема в приложении, которое я пишу, но чтобы изолировать ее, я сделал следующее:

Создайте новый проект с окном. В редакторе XIB добавьте к нему NSPredicateEditor и добавьте одну строку. Оставьте его как ключевые пути / строки и добавьте два ключевых пути - "заголовок" и "писатель". Сделайте так, чтобы он был диакритическим и нечувствительным.

Создайте подкласс NSWindowController и добавьте IBOutlet для редактора предикатов.

В awakeFromNib поместите следующий код:

NSPredicate * myPredicate = [NSPredicate ultimateateWithFormat: @"(название СОДЕРЖИТ [CD] %@) И (писатель СОДЕРЖИТ [CD] %@)", @ "", @ ""];

[_predicateEditor setObjectValue: myPredicate];

Это приводит к следующему в консоли:

2011-04-12 15: 59: 37.709 PredicateTest [38419: 903] Предупреждение - невозможно найти шаблон, соответствующий названию предиката CONTAINS [cd] ""

2011-04-12 15: 59: 37.710 PredicateTest [38419: 903] Предупреждение - невозможно найти сопоставление шаблонов с предикатом-автором СОДЕРЖИТ [cd] ""

Когда я нажимаю кнопку (+), чтобы добавить новую строку, я получаю следующее:

2011-04-12 15: 59: 40.044 PredicateTest [38419: 903] Невозможно создать предикат сравнения с оператором или выражением nil.

Правильно ли я считаю, что здесь я не делаю ничего плохого, и это должно сработать? Если я изменю шаблон строки редактора предикатов в сторону от ключевых путей, затем переключу его обратно на ключевые пути и отредактирую список ключевых путей, Xcode аварийно завершает работу с исключением из-за внутренней согласованности, что заставляет меня думать, что Xcode 4 не может работать, когда речь идет о редактировании предикатов.

У кого-нибудь есть идеи? Я пытался создать NSPredicateEditor в коде, а не в редакторе XIB, и без конца возился безрезультатно. Функциональность редактирования предикатов - это все, что меня удерживает, когда я выпускаю приложение в магазин, так что это немного раздражает.

4 ответа

Решение

Я знаю, что это не тот ответ, который вы хотите услышать, но я настоятельно рекомендую настроить редактор предикатов программно. Настройка в IB, по моему опыту, не очень интуитивно понятна. По крайней мере, в коде вы можете ясно видеть, что происходит.

NSArray *keyPaths = @[[NSExpression expressionForKeyPath:@"title"],
                      [NSExpression expressionForKeyPath:@"writer"]];
NSArray *operators = @[@(NSEqualToPredicateOperatorType),
                       @(NSNotEqualToPredicateOperatorType),
                       @(NSBeginsWithPredicateOperatorType),
                       @(NSEndsWithPredicateOperatorType),
                       @(NSContainsPredicateOperatorType)];

NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions:keyPaths
                                                                          rightExpressionAttributeType:NSStringAttributeType
                                                                                              modifier:NSDirectPredicateModifier 
                                                                                             operators:operators 
                                                                                               options:(NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption)];

NSArray *compoundTypes = @[@(NSNotPredicateType),
                           @(NSAndPredicateType),
                           @(NSOrPredicateType)];
NSPredicateEditorRowTemplate *compound = [[NSPredicateEditorRowTemplate alloc] initWithCompoundTypes:compoundTypes];

[myPredicateEditor setRowTemplates:@[template, compound]];

Кажется, это действительно ошибка в xCode 4. Когда вы зарегистрируете предикат, сформированный предикатом предиката, вы увидите, что он звучит

"date" >= CAST(344464706.878616, "NSDate")

вместо:

date> = CAST (344464706.878616, "NSDate")

Первый стиль встречается в xCode 4, а последний в xCode 3.

У меня та же проблема с XCode 4 и NSPredicateEditor, так что это не только вы. Я смог открыть свой код в XCode 3, удалить привязки в IB и переназначить привязки, и все заработало нормально. Это как-то связано с тем, как XCode 4 устанавливает привязки - похоже, глючит. Установка его программно, вероятно, лучший ответ, если XCode 3 не вариант.

Столкнувшись с той же проблемой с XCode4, к сожалению, я не могу больше тестировать с IB Xcode3.

Начиная с примера, найденного здесь http://nvie.com/posts/nspredicateeditor-tutorial/ я подозреваю, что в XCode4 IB есть ошибки, потому что добавление ключевого пути в Редакторе предикатов через IB и добавление записи в DEFAULT_PREDICATE приводит к "Предупреждение - невозможно найти предикат соответствия шаблона ".. Проверьте этот пример, чтобы понять;) Кажется, есть известная проблема? Может быть, я что-то упустил..

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