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 приводит к "Предупреждение - невозможно найти предикат соответствия шаблона ".. Проверьте этот пример, чтобы понять;) Кажется, есть известная проблема? Может быть, я что-то упустил..