Реализация проверки
Прежде чем это будет выведено на экран, элемент интерфейса пользователя проверяет, чтобы видеть, реализует ли его цель validateUserInterfaceItem:
. Если это делает, то включенное состояние элемента определяется возвращаемым значением метода. Можно поэтому условно включить или отключить элемент путем реализации validateUserInterfaceItem:
в целевом объекте.
Целевой объект
В некоторых ситуациях (обычно, если Вы ставите цель и действие в Интерфейсном Разработчике), цель является объектом, с которым элемент интерфейса пользователя подключен непосредственно; в других ситуациях (когда цель элемента интерфейса пользователя nil
— такой, как будто Вы подключили его к Первому Респонденту в Интерфейсном Разработчике), цель является первым объектом в цепочке респондента, реализующей ее метод действия. Для получения дополнительной информации см. “Цепочку респондента для сообщений Действия” в Руководство по обработке событий какао> Архитектура события. В любом случае важная вещь понять состоит в том, что цель является объектом, реализующим метод действия элемента интерфейса пользователя. (Цель является также объектом, имеющим подходящий контекст, чтобы знать, является ли действие надлежащим.) Следовательно объект, который должен реализовать validateUserInterfaceItem:
тот же объект, реализующий метод действия.
Например, предположите, что у Вас есть объект контроллера, реализующий a paste:
метод. Когда paste:
метод вызывается, он получает значение от области монтажа и затем вставляет его в текущий выбор. Если существует допустимое значение на области монтажа, это может только сделать это. Объект контроллера поэтому также реализует validateUserInterfaceItem:
. validateUserInterfaceItem:
проверки, чтобы видеть, содержит ли область монтажа применимые данные, и если это делает это возвраты YES
иначе это возвращается NO
. Если область монтажа не содержит применимые данные, элемент интерфейса пользователя отключен.
Если в Вашем приложении у Вас есть больше чем один реализующий контроллер paste:
— каждый ответственный за вставку различных данных — тогда у каждого должна быть его собственная реализация validateUserInterfaceItem:
это проверяет, чтобы видеть, содержит ли область монтажа данные, применимые им.
Шаги реализации
Реализация validateUserInterfaceItem:
должен выполнить эти шаги:
Чтобы решить, должен ли элемент быть включен, необходимо знать то, что он сделает, если пользователь выбирает его. Отправитель реализует
NSValidatedUserInterfaceItem
протокол, таким образом, можно узнать, какой тег и действие связаны с ним. Вы обычно сначала поэтому проверяете для наблюдения, какое действие связано с элементом (необходимо протестировать на каждое из действий, Вы интересуетесь).Проверка действия, а не тега означает предотвращение хрупкости необходимости не забыть использовать тот же тег для каждого элемента пользовательского интерфейса, вызывающего тот же метод на цель.
Если действие - что-то, что Вы интересуетесь, то возвращаете булево значение, подходящее для текущего контекста.
Если действие не что-то, что Вы интересуетесь, то также:
Если Ваш суперкласс реализует метод проверки (например,
NSDocument
иNSObjectController
реализацияvalidateUserInterfaceItem:
), вызовите реализацию super; иначеВозвратите значение по умолчанию (обычно
YES
).
Реализация в качестве примера
Следующий пример иллюстрирует реализацию validateUserInterfaceItem:
в подклассе NSDocument
.
- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem |
{ |
SEL theAction = [anItem action]; |
if (theAction == @selector(copy:)) |
{ |
if ( /* there is a current selection and it is copyable */ ) |
{ |
return YES; |
} |
return NO; |
} else if (theAction == @selector(paste:)) |
{ |
if ( /* there is a something on the pasteboard we can use and |
the user interface is in a configuration in which it makes sense to paste */ ) |
{ |
return YES; |
} |
return NO; |
} else |
/* check for other relevant actions ... */ |
} |
// subclass of NSDocument, so invoke super's implementation |
return [super validateUserInterfaceItem:anItem]; |
} |