Как определить, существует ли ключ для объекта, использующего Key-Value Coding?

Установка непрозрачности элемента FrameworkE задает непрозрачность каждого дочернего элемента этого элемента FrameworkElement. Если у элемента FrameworkElement есть дети (кнопки, текстовые поля или любые другие элементы), вы должны пойти с опцией 1.

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

37
задан Ted 8 December 2009 в 18:27
поделиться

2 ответа

Если вы создаете объект, который проверяется, вы можете переопределить valueForUndefinedKey: и setValue: forUndefinedKey , чтобы сделать что-то более полезное, чем повышение исключение.

Если, с другой стороны, вы пытаетесь интроспектировать объекты, о которых вы не знаете, во время выполнения, вам придется использовать для этого методы времени выполнения. Вы можете либо использовать саму среду выполнения objective-c и вызвать class_copyPropertyList или protocol_copyPropertyList и работать с ними, либо использовать Foundation и вызвать RespondsToSelector для объекта для Средства получения / установки KVC для данного свойства, например, для свойства foo , вы должны вызвать что-то вроде [someObject responsedsToSelector: NSSelectorFromString (@ "foo")];

55
ответ дан 27 November 2019 в 03:42
поделиться

Как правило, невозможно определить, имеет ли объект значение для данного ключа. Экземпляр может решить вернуть значение для иначе неопределенного ключа из своего метода -valueForUndefinedKey: . Или он может позволить реализации по умолчанию генерировать исключение. Современные объекты Objective-C (2.0) часто объявляют соответствующие свойства в своих общедоступных API. Для этих объектов вы можете использовать class_copyPropertyList или protocol_copyPropertyList среды выполнения Objective-C, чтобы получить список доступных свойств. Вы также можете эмулировать список поиска KVC, проверяя через repondsToSelector: , если экземпляр отвечает на соответствующий метод получения. Наконец, вы можете использовать среду выполнения ' s class_copyIvarList , чтобы проверить ivars на наличие соответствующего ivar. Это много работы, которую вам не следует выполнять . Это не гарантирует, что вы знаете, вызовет ли экземпляр объекта исключение при отправке сообщения valueForKey: , и это указывает на более серьезную проблему ...

Если у вас есть коллекция объектов, которые должны все укажите значение для данного ключа, но некоторые этого не делают, у вас проблемы с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

Это много работы, которую вам не следует выполнять . Это не гарантирует, что вы знаете, вызовет ли экземпляр объекта исключение при отправке сообщения valueForKey: , и это указывает на более серьезную проблему ...

Если у вас есть коллекция объектов, которые должны все укажите значение для данного ключа, но некоторые этого не делают, у вас проблемы с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

Это много работы, которую вам не следует выполнять . Это не гарантирует, что вы знаете, вызовет ли экземпляр объекта исключение при отправке сообщения valueForKey: , и это указывает на более серьезную проблему ...

Если у вас есть коллекция объектов, которые должны все укажите значение для данного ключа, но некоторые этого не делают, у вас проблемы с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

t гарантировать, что вы знаете, вызовет ли экземпляр объекта исключение при отправке сообщения valueForKey: , и это указывает на более серьезную проблему ...

Если у вас есть коллекция объектов, которые все должны предоставлять значение для данного ключа, а некоторые нет, у вас проблема с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

t гарантировать, что вы знаете, вызовет ли экземпляр объекта исключение при отправке сообщения valueForKey: , и это указывает на более серьезную проблему ...

Если у вас есть коллекция объектов, которые все должны предоставлять значение для данного ключа, а некоторые нет, у вас проблема с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

Если у вас есть коллекция объектов, которые все должны предоставлять значение для данного ключа, а некоторые нет, у вас проблема с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

Если у вас есть коллекция объектов, которые все должны предоставлять значение для данного ключа, а некоторые нет, у вас проблема с дизайном. Вы должны определить соответствующий интерфейс ( @protocol в Objective-C), который объявляет необходимые свойства. Затем вы можете проверить соответствие этому протоколу или использовать компилятор для проверки типов во время компиляции, чтобы убедиться, что экземпляр соответствует протоколу (если вы передаете отдельные экземпляры).

5
ответ дан 27 November 2019 в 03:42
поделиться