Реализация проверки

Прежде чем это будет выведено на экран, элемент интерфейса пользователя проверяет, чтобы видеть, реализует ли его цель validateUserInterfaceItem:. Если это делает, то включенное состояние элемента определяется возвращаемым значением метода. Можно поэтому условно включить или отключить элемент путем реализации validateUserInterfaceItem: в целевом объекте.

Целевой объект

В некоторых ситуациях (обычно, если Вы ставите цель и действие в Интерфейсном Разработчике), цель является объектом, с которым элемент интерфейса пользователя подключен непосредственно; в других ситуациях (когда цель элемента интерфейса пользователя nil— такой, как будто Вы подключили его к Первому Респонденту в Интерфейсном Разработчике), цель является первым объектом в цепочке респондента, реализующей ее метод действия. Для получения дополнительной информации см. “Цепочку респондента для сообщений Действия” в Руководство по обработке событий какао> Архитектура события. В любом случае важная вещь понять состоит в том, что цель является объектом, реализующим метод действия элемента интерфейса пользователя. (Цель является также объектом, имеющим подходящий контекст, чтобы знать, является ли действие надлежащим.) Следовательно объект, который должен реализовать validateUserInterfaceItem: тот же объект, реализующий метод действия.

Например, предположите, что у Вас есть объект контроллера, реализующий a paste: метод. Когда paste: метод вызывается, он получает значение от области монтажа и затем вставляет его в текущий выбор. Если существует допустимое значение на области монтажа, это может только сделать это. Объект контроллера поэтому также реализует validateUserInterfaceItem:. validateUserInterfaceItem: проверки, чтобы видеть, содержит ли область монтажа применимые данные, и если это делает это возвраты YES иначе это возвращается NO. Если область монтажа не содержит применимые данные, элемент интерфейса пользователя отключен.

Если в Вашем приложении у Вас есть больше чем один реализующий контроллер paste:— каждый ответственный за вставку различных данных — тогда у каждого должна быть его собственная реализация validateUserInterfaceItem: это проверяет, чтобы видеть, содержит ли область монтажа данные, применимые им.

Шаги реализации

Реализация validateUserInterfaceItem: должен выполнить эти шаги:

  1. Чтобы решить, должен ли элемент быть включен, необходимо знать то, что он сделает, если пользователь выбирает его. Отправитель реализует NSValidatedUserInterfaceItem протокол, таким образом, можно узнать, какой тег и действие связаны с ним. Вы обычно сначала поэтому проверяете для наблюдения, какое действие связано с элементом (необходимо протестировать на каждое из действий, Вы интересуетесь).

    Проверка действия, а не тега означает предотвращение хрупкости необходимости не забыть использовать тот же тег для каждого элемента пользовательского интерфейса, вызывающего тот же метод на цель.

  2. Если действие - что-то, что Вы интересуетесь, то возвращаете булево значение, подходящее для текущего контекста.

  3. Если действие не что-то, что Вы интересуетесь, то также:

    1. Если Ваш суперкласс реализует метод проверки (например, NSDocument и NSObjectController реализация validateUserInterfaceItem:), вызовите реализацию super; иначе

    2. Возвратите значение по умолчанию (обычно 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];
}