Что такое ключевой путь в определяемых пользователем атрибутах среды выполнения?

Я унаследовал проект, и я не понимаю, что такое определенный ключ. Мой вопрос: что такое путь к ключу styleName? это свойство представления? Как я могу узнать, какие ключевые пути доступны?

Например, после того, как я выбираю UILabel из раскадровки, я проверяю инспектор удостоверений и в определяемых пользователем атрибутах времени выполнения я вижу следующее:

введите здесь описание изображения

Я попытался открыть файл main-styles.plist, но не уверен, как он связан.

когда я нажимаю на инспектор атрибутов (все еще сохраняя выделенный UILabel в раскадровке), это выглядит так:

введите здесь описание изображения


person j2emanue    schedule 06.05.2015    source источник
comment
Если вы нажмете на Attitributes Inspect (справа от Identity Inspector), есть ли поле styleName?   -  person nhgrif    schedule 07.05.2015


Ответы (4)


Существует NSKeyValueCoding протокол. , которому соответствуют многие объекты в пределах UIKit.

Одним из методов в NSKeyValueCoding является valueForKey: (и многие другие соответствующие методы, проверьте документацию, на которую я ссылаюсь).

Вызывая valueForKey: для объекта, мы можем во время выполнения получить доступ к свойствам, которые были установлены в построителе интерфейса.

Итак, например, на этой этикетке я мог бы сделать что-то вроде этого:

Цель-C:

NSString *style = [myLabel valueForKey:@"styleName"];

Свифт:

let style = myLabel.valueForKey("styleName")

Теперь я могу получить значение, установленное через Interface Builder, и во время выполнения я могу что-то сделать с меткой в ​​зависимости от того, какое значение было установлено здесь. Например, здесь я мог бы использовать конкретное «имя стиля» для оформления этикетки определенным образом.

Если вы будете искать в проекте valueForKey или "styleName", вы, скорее всего, найдете, где используется это свойство и что именно с ним делается.


Чтобы ответить на мой вопрос об инспекторе атрибутов, начиная с Xcode 6, мы можем использовать свойство @IBInspectable для создания свойств, которые будут отображаться в инспекторе атрибутов (как показано здесь). Рассмотрим это расширение UIView:

extension UIView {
    @IBInspectable var borderColor : UIColor? {
        set (newValue) {
            self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor
        }
        get {
            return UIColor(CGColor: self.layer.borderColor)
        }
    }
}

Теперь, если мы посмотрим на инспектор атрибутов для любого UIView (или подкласса) в нашей раскадровке, мы увидим это:

введите здесь описание изображения

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

введите здесь описание изображения

И всякий раз, когда это представление загружается из XIB в моем приложении, одной из первых вещей, которая происходит, является то, что моему свойству borderColor будет присвоен красный цвет, который я выбрал в Interface Builder.

person nhgrif    schedule 06.05.2015

Ниже приведен список доступных типов атрибутов и соответствующих типов свойств.

 Boolean – BOOL (true/false)
 Number – NSNumber * or any numeric scalar, e.g. NSInteger
 String – NSString 
 Point – CGPoint
 Size – CGSize
 Rect – CGRect
 Range – NSRange
 Color – UIColor 

«На

person Amit Jagesha シ    schedule 16.06.2016

На основе документа Apple

Используйте определяемые пользователем атрибуты среды выполнения, чтобы задать начальное значение для объектов, у которых нет инспектора построителя интерфейса. Например, если вы добавите следующие записи в инспекторе удостоверений для пользовательского представления:

Изображение атрибутов времени выполнения

Пользовательское представление получит это сообщение при загрузке пера:

[customView setValue:[NSNumber numberWithBoolean:NO] forKeyPath:@"isDataLoaded"];
[customView setValue:@"Hatha" forKeyPath:@"excersize.yoga"];
[customView setValue:nil forKeyPath:@"myData"];

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

Потому что эти методы вызываются при загрузке nib. Таким образом, эти атрибуты времени выполнения можно получить внутри файла -(void)awakeFromNib.

Например,

- (void)awakeFromNib
{
// @property (nonatomic) BOOL isDataLoaded, which is assigned by the above `User Defined Runtime Attributes` picture.
   BOOL isLoaded = self.isDataLoaded; 
}
person AechoLiu    schedule 05.10.2015

спасибо нгриф. На самом деле благодаря вашему ответу, который был великолепен, плюс один, я нашел, что происходит. Они создали глобальную категорию в UIView. это называется UIView+mystyle. там у них есть метод со следующей сигнатурой:

- (void) setStyleName:(NSString*) styleName

поэтому xcode использует этот метод без «набора» и сопоставляет его с атрибутом пути ключа времени выполнения. в этом методе они применяют атрибут.

person j2emanue    schedule 07.05.2015